《(中職)計(jì)算機(jī)程序設(shè)計(jì)(C語言)第九章第2節(jié)教學(xué)課件工信版》由會員分享,可在線閱讀,更多相關(guān)《(中職)計(jì)算機(jī)程序設(shè)計(jì)(C語言)第九章第2節(jié)教學(xué)課件工信版(13頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,,單擊此處編輯母版文本樣式,,第二級,,第三級,,第四級,,第五級,,,*,YCF,(中職)計(jì)算機(jī)程序設(shè)計(jì)(C語言)第九章第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 ,x[10]={0,1,2,3,4,5,6,7,8,9};,,p=a;,,這里的指針變量
2、p的值是x數(shù)組的首地址,即為&x[0],p的值每增加1則自動(dòng)跳轉(zhuǎn)到下一個(gè)數(shù)組元素的地址。,,因此,x數(shù)組的第i個(gè)元素可表示為:a[i]、*(a+i)、*(p+i),其中*(p+i)為指針表示法;x數(shù)組的第i個(gè)元素的地址可表示為:&a[i]?、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) f
3、or (p=x;p
4、,(1)程序第6行中的p++不能用x++替換,因?yàn)閿?shù)組名x代表數(shù)組的起始地址,它是對于一個(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、利用指針變量輸出字符串,,
5、如:,,char *p ="student";,,printf("%s\n",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)會給
6、s分配一片連續(xù)的存儲單元,而定義指針變量p時(shí),系統(tǒng)只給p分配一個(gè)存儲單元。,,(2)存儲方式不同:數(shù)組s中存放的是字符串中的字符和’\0’,而指針變量p中存放的是字符串的首地址。,,(3)賦值方式不同:,,數(shù)組可以進(jìn)行初始化,但不能使用賦值語句;,,如:,,char str1[10],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);,,w
7、hile (*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;,,},,vo
8、id main( ),,{,,int x,y ;,,int *p1,*p2;,,p1=,,p2=,,x=5;,,y=10;,,swap(p1,p2);,,printf("x=%d\ty=%d\n",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ù)的返回量,,我們在前面用到的函數(shù)中的返回值的數(shù)據(jù)類型主要有int ,float ,char ,double等,還可以無返回值即返回值
9、類型為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
10、buf[SIZE];,,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=bufbuf[1]buf[0]buf[99]…buf[15]buf[14]buf[13]…buf[10]buf[9]…buf[8]…21\0d…a\09圖9-2-3,,char *p1,*p2;,,int i;,,p1=al
11、loc(10);,,strcpy(p1, "123456789");,,p2=alloc(5);,,strcpy(p2, "abcd");,,printf("buf=%p\n",buf);,,printf("p1=%p\n",p1);,,printf("p2=%p\n",p2);,,puts(p1);,,puts(p2);,,for (i=0;i<15;i++),,printf("%c",buf[i]);,,},,,分析如圖9-2-3所示,,說明:(1)格式字符串%p輸出變量的內(nèi)存地址。,,(2)buf數(shù)組的輸出在這里不能用%s,若用%s,,只能輸出p1所指的字符串。,,用for (i=0;i<15;i++) printf("%c",buf[i]);,,可將兩個(gè)字符串都輸出。,,程序運(yùn)行結(jié)果:,,buf=00427E64,,p1=00427E64,,p2=00427E6E,,123456789,,abcd,,123456789 abcd,①,③,②,p2= buf+10,p,p1=buf,buf[1],,buf[0],buf[99],,…,,buf[15],,buf[14],,buf[13],,…,,buf[10],,buf[9],,…,,,buf[8],,…,,2,1,,,,\0,d,…,,a,\0,9,圖9-2-3,,,