(中職)計(jì)算機(jī)程序設(shè)計(jì)(C語(yǔ)言)第九章第2節(jié)教學(xué)課件工信版
單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,YCF,(中職)計(jì)算機(jī)程序設(shè)計(jì)(C語(yǔ)言)第九章第2節(jié)教學(xué)課件工信版,第九章 指針與結(jié)構(gòu)體,9.2指針變量的應(yīng)用,9.2指針變量的應(yīng)用,9.2.1指針與數(shù)組,9.2.2指針與字符串,9.2.3指針與函數(shù),9.2.1指針與數(shù)組,1、一維數(shù)組元素及數(shù)組元素的地址,假設(shè)有一5個(gè)元素的a數(shù)組,則元素和地址分別可以表示如圖9-2-1,2、用指針變量引用數(shù)組元素,如:,int *p ,x10=0,1,2,3,4,5,6,7,8,9;,p=a;,這里的指針變量p的值是x數(shù)組的首地址,即為&x0,p的值每增加1則自動(dòng)跳轉(zhuǎn)到下一個(gè)數(shù)組元素的地址。,因此,x數(shù)組的第i個(gè)元素可表示為:ai、*(a+i)、*(p+i),其中*(p+i)為指針表示法;x數(shù)組的第i個(gè)元素的地址可表示為:&ai 、a+i、p+i,其中p+i為指針表示法。,3、指針變量在數(shù)組中的應(yīng)用,【例9.9】將數(shù)組x中全部元素變成原來的2倍,再輸出x數(shù)組。,(1) # include ,(2) void main( ),(3) ,(4) int x =1,2,3,4,5;,(5) int *p,i;,(6) for (p=x;p<x+5;p+),(7) printf("%5d",*p);,(8) printf(“n”);,(9) for (i=0;i<5;i+),(10) xi=xi*2;,(11) p=x;,(12) for (i=0;i<5;i+),(13) printf("%5d",*(p+i);,(14) printf("n");,(15) ,程序運(yùn)行結(jié)果:,1 2 3 4 5,2 4 6 8 10,注意:,(1)程序第6行中的p+不能用x+替換,因?yàn)閿?shù)組名x代表數(shù)組的起始地址,它是對(duì)于一個(gè)已經(jīng)定義的數(shù)組是不能改變的,即為一個(gè)地址常量,而指針變量p是一個(gè)指針變量;,(2)程序第11行,不能省略,必須要把指針變量p的值重新拉回到數(shù)組x的首地址;,(3)程序第13行,在使用指針變量時(shí)要注意地址的值不能超出數(shù)組元素的界限。,9.2.2指針與字符串,1、指向字符串的指針變量的定義,如:,char *p ="student",這里的賦值只是把字符串的首地址賦給p,而不是把字符串賦給p,p是一個(gè)指針變量,它不能存放一個(gè)字符串,只能存放一個(gè)地址。,2、利用指針變量輸出字符串,如:,char *p ="student",printf("%sn",p);,輸出字符串時(shí),從指針變量p所記錄的首地址開始依次向后輸出直到碰到字符口串結(jié)束符´0´為止。,因此,也可以用循環(huán)來實(shí)現(xiàn)字符串中字符的逐個(gè)輸出,如:,char *p = "student",for (;*p!= ´0´p+),printf("%c",*p);,3、字符數(shù)組與字符指針變量的區(qū)別,如:,char s = "I am a student. ",char *p= "I am a student. ",(1)系統(tǒng)分配空間不同:定義數(shù)組s時(shí),系統(tǒng)會(huì)給s分配一片連續(xù)的存儲(chǔ)單元,而定義指針變量p時(shí),系統(tǒng)只給p分配一個(gè)存儲(chǔ)單元。,(2)存儲(chǔ)方式不同:數(shù)組s中存放的是字符串中的字符和0,而指針變量p中存放的是字符串的首地址。,(3)賦值方式不同:,數(shù)組可以進(jìn)行初始化,但不能使用賦值語(yǔ)句;,如:,char str110,str2 = "great“;,4、字符串指針的應(yīng)用,【例9.10】利用字符串指針實(shí)現(xiàn)兩個(gè)字符串的復(fù)制。,# include ,void main ( ),char *a= "tiger",*b= "dog",char *x=a,*y=b;,puts(a);,puts(b);,while (*y!= ´0´),*x=*y;,x+;,y+;,*x=´0´,puts(a);,puts(b);,分析如圖9-2-2,x,x+,x+,x+,y,y+,y+,y+,0,g,o,d,t,i,g,e,r,0,a,b,圖9-2-2,9.2.3指針與函數(shù),1、指針變量作函數(shù)的參數(shù),【例9.11】編程實(shí)現(xiàn)兩個(gè)整型變量值的交換(要求用函數(shù)swap( )實(shí)現(xiàn)兩數(shù)值的交換)。,# include ,void swap(int *a,int *b),int t;,t=*a;,*a=*b;,*b=t;,void main( ),int x,y ;,int *p1,*p2;,p1=,p2=,x=5;,y=10;,swap(p1,p2);,printf("x=%dty=%dn",x,y);,程序中在調(diào)用swap( )函數(shù)時(shí)將變量x和y的地址分別傳遞給了指針變量a和b,形參和實(shí)參之間的傳遞關(guān)系為“地址傳遞”,即實(shí)參隨著形參的改變而改變。,程序運(yùn)行結(jié)果:,x=10 y=5,實(shí)現(xiàn)了x和y值的交換功能。,2、指針變量作函數(shù)的返回量,我們?cè)谇懊嬗玫降暮瘮?shù)中的返回值的數(shù)據(jù)類型主要有int ,float ,char ,double等,還可以無返回值即返回值類型為void,函數(shù)的返回值其實(shí)也可以是一個(gè)指針類型的數(shù)據(jù)(即地址)。,若函數(shù)的返回值是一個(gè)指針類型的數(shù)據(jù),則函數(shù)的定義格式如下:,數(shù)據(jù)類型 *函數(shù)名(形參表列),函數(shù)體;,如:,int *fun(int x, int y),【例9.12】在一個(gè)字符型數(shù)組中存放兩個(gè)字符串,分別用兩個(gè)指針變量記錄它們的首地址(每個(gè)字符串的首地址的值由一個(gè)指針函數(shù)返回),分別輸出字符型數(shù)組和兩個(gè)字符串的首地址的值及兩個(gè)字符串和字符型數(shù)組中已被賦好的字符。,# include ,# include ,# define SIZE 100,char bufSIZE;,char *p=buf;,char *alloc(int n),char *begin;,if (p+n<=buf+ SIZE),begin=p;,p=p+n;,return(begin);,else,return(NULL);,void main ( ),p2= buf+10pp1=bufbuf1buf0buf99buf15buf14buf13buf10buf9buf8210da09圖9-2-3,char *p1,*p2;,int i;,p1=alloc(10);,strcpy(p1, "123456789");,p2=alloc(5);,strcpy(p2, "abcd");,printf("buf=%pn",buf);,printf("p1=%pn",p1);,printf("p2=%pn",p2);,puts(p1);,puts(p2);,for (i=0;i<15;i+),printf("%c",bufi);,分析如圖9-2-3所示,說明:(1)格式字符串%p輸出變量的內(nèi)存地址。,(2)buf數(shù)組的輸出在這里不能用%s,若用%s,只能輸出p1所指的字符串。,用for (i=0;i<15;i+) printf("%c",bufi);,可將兩個(gè)字符串都輸出。,程序運(yùn)行結(jié)果:,buf=00427E64,p1=00427E64,p2=00427E6E,123456789,abcd,123456789 abcd,p2= buf+10,p,p1=buf,buf1,buf0,buf99,buf15,buf14,buf13,buf10,buf9,buf8,2,1,0,d,a,0,9,圖9-2-3,