第8章 C語(yǔ)言指針_第1頁(yè)
第8章 C語(yǔ)言指針_第2頁(yè)
第8章 C語(yǔ)言指針_第3頁(yè)
第8章 C語(yǔ)言指針_第4頁(yè)
第8章 C語(yǔ)言指針_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第8 8章章 C C語(yǔ)言指針語(yǔ)言指針下一頁(yè)下一頁(yè)返返 回回本章要點(diǎn)本章要點(diǎn) 指針的概念指針的概念 指針變量的定義和使用指針變量的定義和使用 指針在數(shù)組和函數(shù)中的應(yīng)用指針在數(shù)組和函數(shù)中的應(yīng)用 字符指針的引用字符指針的引用學(xué)習(xí)方法建議學(xué)習(xí)方法建議 本章的內(nèi)容是本章的內(nèi)容是C語(yǔ)言中最難理解的部分,學(xué)習(xí)時(shí)應(yīng)注意語(yǔ)言中最難理解的部分,學(xué)習(xí)時(shí)應(yīng)注意歸納。首先要理解指針的概念,然后掌握指針變量與一般歸納。首先要理解指針的概念,然后掌握指針變量與一般變量的區(qū)別,掌握其定義方法,同時(shí)還要理解指針與數(shù)組、變量的區(qū)別,掌握其定義方法,同時(shí)還要理解指針與數(shù)組、指針與函數(shù)的關(guān)系,這一章要多下一些功夫才能真正學(xué)會(huì)指針與

2、函數(shù)的關(guān)系,這一章要多下一些功夫才能真正學(xué)會(huì)指針的應(yīng)用。指針的應(yīng)用。目目 錄錄8.18.1 指針與指針變量指針與指針變量8.28.2 指針與數(shù)組指針與數(shù)組8.38.3 指針與字符串指針與字符串8.58.5 指針應(yīng)用舉例指針應(yīng)用舉例 返返 回回上一頁(yè)上一頁(yè)8.68.6 本章小結(jié)本章小結(jié) 8.48.4 指針與函數(shù)指針與函數(shù) 8.1 指針與指針變量指針與指針變量下一頁(yè)下一頁(yè)返返 回回8.1.1 指針的概念指針的概念計(jì)算機(jī)的內(nèi)存是以字節(jié)為單位的一片連續(xù)的存儲(chǔ)空間,每一個(gè)字節(jié)都有一個(gè)計(jì)算機(jī)的內(nèi)存是以字節(jié)為單位的一片連續(xù)的存儲(chǔ)空間,每一個(gè)字節(jié)都有一個(gè)編號(hào),這個(gè)編號(hào)就稱為內(nèi)存地址。編號(hào),這個(gè)編號(hào)就稱為內(nèi)存地

3、址。 一般來(lái)講,程序中的變量經(jīng)過(guò)編譯系統(tǒng)處理后都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址,一般來(lái)講,程序中的變量經(jīng)過(guò)編譯系統(tǒng)處理后都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址,也就是說(shuō),編譯系統(tǒng)根據(jù)變量的類型,為其分配相應(yīng)的內(nèi)存單元,以便存放也就是說(shuō),編譯系統(tǒng)根據(jù)變量的類型,為其分配相應(yīng)的內(nèi)存單元,以便存放變量的內(nèi)容。不同類型的變量所分配的內(nèi)存單元的長(zhǎng)度是不一樣的。變量的內(nèi)容。不同類型的變量所分配的內(nèi)存單元的長(zhǎng)度是不一樣的。若在程序中定義了一個(gè)變量,若在程序中定義了一個(gè)變量,C編譯系統(tǒng)就會(huì)根據(jù)定義中變量的類型,為其編譯系統(tǒng)就會(huì)根據(jù)定義中變量的類型,為其分配一定字節(jié)的內(nèi)存空間,此后,這個(gè)變量的內(nèi)存地址也就確定了。例如,分配一定字節(jié)的

4、內(nèi)存空間,此后,這個(gè)變量的內(nèi)存地址也就確定了。例如,若有定義:若有定義:int a;這時(shí),將如下圖所示:系統(tǒng)為變量;這時(shí),將如下圖所示:系統(tǒng)為變量a分配分配4個(gè)字節(jié)的存儲(chǔ)個(gè)字節(jié)的存儲(chǔ)單元,圖中的數(shù)字只是示意的字節(jié)地址。每個(gè)變量的地址是指該變量所占存單元,圖中的數(shù)字只是示意的字節(jié)地址。每個(gè)變量的地址是指該變量所占存儲(chǔ)單元的第儲(chǔ)單元的第1個(gè)字節(jié)地址。在這里,我們稱個(gè)字節(jié)地址。在這里,我們稱a的地址為的地址為1201。變量變量a1201 1202 1203 1204 在在C語(yǔ)言中,我們還可以定義一種特殊的變量,這種變量是專門(mén)用來(lái)存放內(nèi)存語(yǔ)言中,我們還可以定義一種特殊的變量,這種變量是專門(mén)用來(lái)存放內(nèi)存

5、地址的。如圖地址的。如圖8.2(a)所示,假設(shè)我們定義了一個(gè)這樣的變量)所示,假設(shè)我們定義了一個(gè)這樣的變量p,它也有自已,它也有自已的地址(的地址(2002);若將變量);若將變量a的內(nèi)存地址(的內(nèi)存地址(1201)存放到變量)存放到變量p中,這時(shí)要訪中,這時(shí)要訪問(wèn)變量問(wèn)變量a所代表的存儲(chǔ)單元,可以先找到變量所代表的存儲(chǔ)單元,可以先找到變量p的地址(的地址(2002),從中取出),從中取出a的的地址(地址(1201),然后再去訪問(wèn)以),然后再去訪問(wèn)以1201為首地址的存儲(chǔ)單元。這種通過(guò)變量為首地址的存儲(chǔ)單元。這種通過(guò)變量p間間接得到變量接得到變量a的地址,然后再存取變量的地址,然后再存取變量a

6、的方式稱為的方式稱為“間接存取間接存取”方式。方式。上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回在上述情況下,通常稱變量在上述情況下,通常稱變量p指向了變量指向了變量a,變量,變量a是變量是變量p所指的對(duì)象;它所指的對(duì)象;它們之間的關(guān)系可用圖們之間的關(guān)系可用圖8.2(b)表示。這種)表示。這種“指向指向”關(guān)系是通過(guò)地址建立的,關(guān)系是通過(guò)地址建立的,圖中的圖中的“”只是一種示意,形似只是一種示意,形似“指針指針”。從這個(gè)意義上講,我們將一。從這個(gè)意義上講,我們將一個(gè)變量的個(gè)變量的“地址地址”稱為稱為“指針指針”。如:變量。如:變量a的地址就稱為變量的地址就稱為變量a的指針。的指針。顯然,指針是地址的一個(gè)形

7、象化的名稱。相應(yīng)地,用來(lái)存放指針(即地址)顯然,指針是地址的一個(gè)形象化的名稱。相應(yīng)地,用來(lái)存放指針(即地址)的變量就稱作的變量就稱作“指針變量指針變量”。上述變量。上述變量p就是一個(gè)指針變量。所以就是一個(gè)指針變量。所以“變量變量p指向了變量指向了變量a”的含義就是指針變量的含義就是指針變量p中存放了變量中存放了變量a的地址。的地址。上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回1指針變量的定義指針變量的定義任何變量在使用前都必須先定義,指針變量也一樣。指針變量定義的一般形任何變量在使用前都必須先定義,指針變量也一樣。指針變量定義的一般形式為:式為:數(shù)據(jù)類型數(shù)據(jù)類型 *指針變量名指針變量名1,*指針變量名指

8、針變量名2,;例如:例如:int *p1,*p2;說(shuō)明:說(shuō)明:(1)定義兩個(gè)指針變量,變量名為)定義兩個(gè)指針變量,變量名為p1和和p2,這兩個(gè)變量只能用來(lái)存放整型,這兩個(gè)變量只能用來(lái)存放整型變量的地址。變量的地址。(2)這里)這里“*”表示定義的是指針變量,是指針類型的標(biāo)志。表示定義的是指針變量,是指針類型的標(biāo)志。(3)“類型名類型名”表示該指針變量所指向的變量的類型,也稱該指針變量的表示該指針變量所指向的變量的類型,也稱該指針變量的基類型,定義指針變量時(shí)必須要有基類型,因?yàn)橐粋€(gè)指針變量中存放的是一基類型,定義指針變量時(shí)必須要有基類型,因?yàn)橐粋€(gè)指針變量中存放的是一個(gè)存儲(chǔ)單元的地址值,而這里的個(gè)

9、存儲(chǔ)單元的地址值,而這里的“一一”對(duì)于不同類型的數(shù)據(jù),所代表的字節(jié)對(duì)于不同類型的數(shù)據(jù),所代表的字節(jié)數(shù)是不同的:對(duì)于數(shù)是不同的:對(duì)于int型數(shù)據(jù)為型數(shù)據(jù)為4個(gè)字節(jié),對(duì)于個(gè)字節(jié),對(duì)于double型數(shù)據(jù)為型數(shù)據(jù)為8個(gè)字節(jié),一個(gè)字節(jié),一個(gè)指針變量只能指向同一種類型的變量。個(gè)指針變量只能指向同一種類型的變量。8.1.2 指針變量的定義和使用指針變量的定義和使用2指針變量的使用指針變量的使用在利用指針變量進(jìn)行間接訪問(wèn)之前,必須使其指向一確定的變量。在利用指針變量進(jìn)行間接訪問(wèn)之前,必須使其指向一確定的變量。C語(yǔ)言中提供了兩個(gè)與指針有關(guān)的運(yùn)算符:語(yǔ)言中提供了兩個(gè)與指針有關(guān)的運(yùn)算符:& 和和 *。(1)“&”是

10、取地址運(yùn)算符,它的功能是取得變量所占用的存儲(chǔ)單元的首地是取地址運(yùn)算符,它的功能是取得變量所占用的存儲(chǔ)單元的首地址。在利用指針變量進(jìn)行間接訪問(wèn)之前,一般都必須使用該運(yùn)算符將某變量址。在利用指針變量進(jìn)行間接訪問(wèn)之前,一般都必須使用該運(yùn)算符將某變量的地址賦給相應(yīng)的指針變量。的地址賦給相應(yīng)的指針變量。例如:例如:int a,b,*pa,*pb;pa=&a; pb=&b; 可以通過(guò)賦值運(yùn)算,把一個(gè)指針變量的地址值賦給具有相同基類型的另一個(gè)可以通過(guò)賦值運(yùn)算,把一個(gè)指針變量的地址值賦給具有相同基類型的另一個(gè)指針變量,從而使這兩個(gè)指針變量獲得同一個(gè)地址值,即指向同一個(gè)變量。指針變量,從而使這兩個(gè)指針變量獲得同

11、一個(gè)地址值,即指向同一個(gè)變量。例如:例如:pb=pa;使指針使指針pb中也存放了中也存放了a的地址,也就是指針變量的地址,也就是指針變量p和和q都指向同一個(gè)變量都指向同一個(gè)變量a。除了給指針變量賦地址值外,還可以給指針變量賦除了給指針變量賦地址值外,還可以給指針變量賦NULL值,例如:值,例如:pa=NULL;上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回NULL是在是在stdio.h頭文件中定義的預(yù)定義符,因此在使用頭文件中定義的預(yù)定義符,因此在使用NULL時(shí),應(yīng)該在時(shí),應(yīng)該在程序的前面出現(xiàn)預(yù)定義行:程序的前面出現(xiàn)預(yù)定義行:#include stdio.h。NULL的值為的值為0,當(dāng)執(zhí)行了,當(dāng)執(zhí)行了以上

12、的賦值語(yǔ)句后,稱以上的賦值語(yǔ)句后,稱p為空指針。因?yàn)闉榭罩羔槨R驗(yàn)镹ULL的代碼為的代碼為0,所以以上語(yǔ)句等,所以以上語(yǔ)句等價(jià)于:價(jià)于:pa=0; 或或 pa=0;這時(shí),指針這時(shí),指針p并不是指向地址為并不是指向地址為0的存儲(chǔ)單元,而是具有一個(gè)確定的值,即的存儲(chǔ)單元,而是具有一個(gè)確定的值,即空值。企圖通過(guò)一個(gè)空值去訪問(wèn)一個(gè)存儲(chǔ)單元時(shí),將會(huì)得到一個(gè)出錯(cuò)信息??罩?。企圖通過(guò)一個(gè)空值去訪問(wèn)一個(gè)存儲(chǔ)單元時(shí),將會(huì)得到一個(gè)出錯(cuò)信息。(2)“*”是間接訪問(wèn)運(yùn)算符(又稱指針運(yùn)算符),它的功能是通過(guò)指針變是間接訪問(wèn)運(yùn)算符(又稱指針運(yùn)算符),它的功能是通過(guò)指針變量來(lái)間接訪問(wèn)它所指向的變量。例如:量來(lái)間接訪問(wèn)它所指

13、向的變量。例如:int i,j,*p;p=&i;*p=10; /*將將10賦給賦給p所指向的變量即變量所指向的變量即變量i,等價(jià)于賦值語(yǔ)句等價(jià)于賦值語(yǔ)句i=10;*/j=*p+1; /*取指針變量取指針變量p所指向的存儲(chǔ)單元中的值加所指向的存儲(chǔ)單元中的值加1后賦給變量后賦給變量j,j的值為的值為11*/*p=*p+1 /*取指針變量取指針變量p所指向的存儲(chǔ)單元中的值,加所指向的存儲(chǔ)單元中的值,加1后再放入后再放入p所指向的所指向的存儲(chǔ)單元中,也就是使變量存儲(chǔ)單元中,也就是使變量i的值增的值增1變?yōu)樽優(yōu)?1*/上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.1】

14、從鍵盤(pán)上輸入任意從鍵盤(pán)上輸入任意3個(gè)實(shí)數(shù),利用指針的方法將這個(gè)實(shí)數(shù),利用指針的方法將這3個(gè)實(shí)數(shù)按由大個(gè)實(shí)數(shù)按由大到小的順序進(jìn)行排序。到小的順序進(jìn)行排序。【程序代碼】【程序代碼】#include stdio.hmain()float a,b,c,*p1,*p2,*p3,*p;printf(請(qǐng)輸入請(qǐng)輸入3個(gè)實(shí)數(shù):個(gè)實(shí)數(shù):);scanf(%f%f%f,&a,&b,&c);p1=&a;p2=&b;p3=&c;if(ab) p=p1;p1=p2;p2=p;if(ac)p=p1;p1=p3;p3=p;if(bc)p=p2;p2=p3;p3=p;printf(%.2f,%.2f,%.2fn,*p1,*p2,

15、*p3);【例【例7.3】 編寫(xiě)程序,調(diào)用例編寫(xiě)程序,調(diào)用例7.1中的函數(shù)。中的函數(shù)?!境绦虼a】【程序代碼】#include stdio.hint sum(int n) int i;int s=0;for( i=1; i=n; i+)s+=i;return s;main( ) int n,s;for(n=10;n40;n+=10) s=sum(n);printf(n=%d, s=%dn,n,s);上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下: C語(yǔ)言中規(guī)定數(shù)組名是一個(gè)指針,該指針指向該數(shù)組的首元素,即數(shù)組名語(yǔ)言中規(guī)定數(shù)組名是一個(gè)指針,該指針指向該數(shù)組的首元素,即數(shù)組名中存放了

16、數(shù)組中第一個(gè)元素的地址值,即數(shù)組的首地址。也就是該數(shù)組所中存放了數(shù)組中第一個(gè)元素的地址值,即數(shù)組的首地址。也就是該數(shù)組所占一串連續(xù)存儲(chǔ)單元的起始地址,因此,數(shù)組名是一個(gè)常量指針,在程序占一串連續(xù)存儲(chǔ)單元的起始地址,因此,數(shù)組名是一個(gè)常量指針,在程序中,不可以給數(shù)組名重新賦值。中,不可以給數(shù)組名重新賦值。因此,引用數(shù)組元素可以用下標(biāo)法,也可以用指針?lè)ǎ赐ㄟ^(guò)指向數(shù)組元因此,引用數(shù)組元素可以用下標(biāo)法,也可以用指針?lè)?,即通過(guò)指向數(shù)組元素的指針找到所需的元素。使用指針?lè)苁鼓繕?biāo)程序質(zhì)量高(占內(nèi)存少,素的指針找到所需的元素。使用指針?lè)苁鼓繕?biāo)程序質(zhì)量高(占內(nèi)存少,運(yùn)行速度快)。運(yùn)行速度快)。上一頁(yè)上一頁(yè)

17、下一頁(yè)下一頁(yè)返返 回回8.2 指針與數(shù)組指針與數(shù)組8.2.1 指針和一維數(shù)組指針和一維數(shù)組1指針的移動(dòng)指針的移動(dòng) 當(dāng)指針變量指向一串連續(xù)的存儲(chǔ)單元(即數(shù)組)時(shí),可以對(duì)指針變量加上當(dāng)指針變量指向一串連續(xù)的存儲(chǔ)單元(即數(shù)組)時(shí),可以對(duì)指針變量加上或減去一個(gè)整數(shù)來(lái)進(jìn)行指針的移動(dòng)和定位。例如有如下語(yǔ)句:或減去一個(gè)整數(shù)來(lái)進(jìn)行指針的移動(dòng)和定位。例如有如下語(yǔ)句:int a5=1,2,3,4,5,*p,*q,k;p=&a0;則:則:p+2 p-3 p+ p- +p -p等,都是合法的。進(jìn)行加法運(yùn)算時(shí),表示等,都是合法的。進(jìn)行加法運(yùn)算時(shí),表示p向地址增大的方向移動(dòng);進(jìn)向地址增大的方向移動(dòng);進(jìn)行減法運(yùn)算時(shí),表示行

18、減法運(yùn)算時(shí),表示p向地址減小的方向移動(dòng)。它們的含義分別是:向地址減小的方向移動(dòng)。它們的含義分別是:p+2 /*指針后移,指向當(dāng)前位置指針后移,指向當(dāng)前位置p后的第后的第2個(gè)存儲(chǔ)單元。個(gè)存儲(chǔ)單元。*/p-3 /*指針前移,指向當(dāng)前位置前的第指針前移,指向當(dāng)前位置前的第3個(gè)存儲(chǔ)單元。個(gè)存儲(chǔ)單元。*/p+或或+p /*當(dāng)前指針位置后移一個(gè)存儲(chǔ)單元。當(dāng)前指針位置后移一個(gè)存儲(chǔ)單元。*/p-或或-p /*當(dāng)前指針位置前移一個(gè)存儲(chǔ)單元。當(dāng)前指針位置前移一個(gè)存儲(chǔ)單元。*/移動(dòng)的具體長(zhǎng)度取決于指針的數(shù)據(jù)類型,由系統(tǒng)自動(dòng)確定。這里的數(shù)字移動(dòng)的具體長(zhǎng)度取決于指針的數(shù)據(jù)類型,由系統(tǒng)自動(dòng)確定。這里的數(shù)字“1”不代表十進(jìn)

19、制整數(shù)不代表十進(jìn)制整數(shù)“1”,而是指,而是指1個(gè)存儲(chǔ)單元長(zhǎng)度;至于個(gè)存儲(chǔ)單元長(zhǎng)度;至于1個(gè)存儲(chǔ)單個(gè)存儲(chǔ)單元的長(zhǎng)度占多少存儲(chǔ)空間,則視指針的基類型而定。元的長(zhǎng)度占多少存儲(chǔ)空間,則視指針的基類型而定。 若有語(yǔ)句若有語(yǔ)句k=q-p;則則k中的值為兩個(gè)指針間相隔元素的個(gè)數(shù)。若表達(dá)式中的值為兩個(gè)指針間相隔元素的個(gè)數(shù)。若表達(dá)式pq的值為真,則說(shuō)明的值為真,則說(shuō)明p中存放的地址值小于中存放的地址值小于q中存放的地址值。中存放的地址值。 上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.3】 把一個(gè)字符串中的字符逆序輸出。把一個(gè)字符串中的字符逆序輸出?!境绦虼a】【程序代碼】#i

20、nclude stdio.hmain( ) char s = abcdefgh;char *p;for(p=s+7;p+1!=s;p-)printf(%c,*p);printf(n);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:程序中,定義了一個(gè)字符數(shù)組程序中,定義了一個(gè)字符數(shù)組s,又定義了一個(gè),又定義了一個(gè)char型指針變量型指針變量p。通過(guò)指。通過(guò)指針加上整數(shù)運(yùn)算,先使指針針加上整數(shù)運(yùn)算,先使指針p指向已知字符串的最后一個(gè)字符指向已知字符串的最后一個(gè)字符h,再輸出,再輸出P所所指向的字符,每次循環(huán)指向的字符,每次循環(huán)p指針減指針減1。判斷。判斷p+1與與s是否相等,是否相等,s是數(shù)組名,即是是數(shù)組名,即是

21、指向數(shù)組首元素的指針。如果指向數(shù)組首元素的指針。如果p+1與與s相等。則說(shuō)明相等。則說(shuō)明p將指向該數(shù)組首元素前將指向該數(shù)組首元素前邊的一個(gè)元素,該元素實(shí)際是不存在的,這時(shí)退出邊的一個(gè)元素,該元素實(shí)際是不存在的,這時(shí)退出for循環(huán),并完成對(duì)該字循環(huán),并完成對(duì)該字符串的逆序輸出。符串的逆序輸出。2通過(guò)指針引用一維數(shù)組元素通過(guò)指針引用一維數(shù)組元素有如下定義:有如下定義:int a 10;int *pa;pa=&a0; 或或 pa=a;則根據(jù)指針變量的間接訪問(wèn)規(guī)則可知:則根據(jù)指針變量的間接訪問(wèn)規(guī)則可知:*paa0,*(pa+1)a1,*(pa+2)a2,*(pa+i)ai。又。又由于數(shù)組名由于數(shù)組名a

22、代表數(shù)組的首地址代表數(shù)組的首地址&a0,a+1代表代表&a1,a+2代表代表&a2,a+i代表代表&ai,則有,則有*aa0,*(a+1)a1,*(a+2)a2,*(a+i) ai。綜上所述,若有:綜上所述,若有:int a10, *pa, i;pa=a;則任意一個(gè)數(shù)組元素則任意一個(gè)數(shù)組元素ai可用以下方法來(lái)表示:可用以下方法來(lái)表示:下標(biāo)法:下標(biāo)法:ai 或或 pai指針?lè)ǎ褐羔樂(lè)ǎ?(pa+i) 或或 *(a+i)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.4】 指針與一維數(shù)組的關(guān)系。指針與一維數(shù)組的關(guān)系?!境绦虼a】【程序代碼】#include stdio.hmain( ) int a5

23、,*p,i;for(i=0;i5;i+) ai=i+1;printf(a%d=%d,i,ai);printf(n);for(i=0;i5;i+)printf(*(a+%d)=%d,i,*(a+i);printf(n);p=a;for(i=0;i5;i+)printf(*(p+%d)=%d,i,*(p+i);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.5】 有一個(gè)數(shù)組有一個(gè)數(shù)組a,存放,存放10個(gè)學(xué)生的成績(jī),求平均成績(jī),要求通過(guò)指針個(gè)學(xué)生的成績(jī),求平均成績(jī),要求通過(guò)指針變量來(lái)訪問(wèn)數(shù)組元素。變量來(lái)訪問(wèn)數(shù)組元素?!揪幊趟悸贰俊揪幊趟悸贰浚?)定義一個(gè)數(shù)組)定義一個(gè)數(shù)組a

24、10,用來(lái)存放,用來(lái)存放10個(gè)學(xué)生的成績(jī)。定義一個(gè)存放個(gè)學(xué)生的成績(jī)。定義一個(gè)存放10個(gè)元個(gè)元素和值的變量素和值的變量sum使其初值置為使其初值置為0,定義表示平均值的變量,定義表示平均值的變量ave,定義指針變量定義指針變量p.。(2)使)使p指向數(shù)組的第一個(gè)元素。指向數(shù)組的第一個(gè)元素。(3)以)以p為循環(huán)控制變量,終值為為循環(huán)控制變量,終值為a+9,通過(guò)間接訪問(wèn)運(yùn)算求和,從而得到,通過(guò)間接訪問(wèn)運(yùn)算求和,從而得到均值。均值。【程序代碼】【程序代碼】#include stdio.hmain()float a10,*p,sum=0,ave;printf(請(qǐng)輸入請(qǐng)輸入10個(gè)學(xué)生成績(jī):個(gè)學(xué)生成績(jī):);

25、for(p=a;pa+10;p+)scanf(%f,p);for(p=a;pa+10;p+)sum+=*p;ave=sum/10;printf(平均成績(jī)平均成績(jī)=%.2fn,ave);上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回運(yùn)行結(jié)果為:運(yùn)行結(jié)果為:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回8.2.2 指針和二維數(shù)組指針和二維數(shù)組若有以下定義若有以下定義 :int *p,a34,i,j;1二維數(shù)組元素的地址二維數(shù)組元素的地址(1)二維數(shù)組)二維數(shù)組a由若干個(gè)一維數(shù)組組成由若干個(gè)一維數(shù)組組成在在C語(yǔ)言中定義的二維數(shù)組實(shí)際上是一個(gè)一維數(shù)組,這個(gè)一維數(shù)組的每語(yǔ)言中定義的二維數(shù)組實(shí)際上是一個(gè)一維數(shù)組,這個(gè)一維數(shù)組的每

26、個(gè)成員又是一個(gè)一維數(shù)組。如以上定義的個(gè)成員又是一個(gè)一維數(shù)組。如以上定義的a數(shù)組,可認(rèn)為由數(shù)組,可認(rèn)為由a0、 a1、 a2等三個(gè)元素組成,而等三個(gè)元素組成,而a0、a1、 a2等每個(gè)元素又分別是由等每個(gè)元素又分別是由4個(gè)整個(gè)整型元素組成的一維數(shù)組??捎眯驮亟M成的一維數(shù)組。可用a00、 a01等來(lái)引用等來(lái)引用a0中的每個(gè)元中的每個(gè)元素,其它依次類推。素,其它依次類推。 前面已講過(guò),前面已講過(guò),C語(yǔ)言中,數(shù)組名是一個(gè)地址常量,其值為數(shù)組中第一個(gè)元語(yǔ)言中,數(shù)組名是一個(gè)地址常量,其值為數(shù)組中第一個(gè)元素的地址,在以上的二維數(shù)組中,素的地址,在以上的二維數(shù)組中,a0、 a1、 a2都是一維數(shù)組名,同樣也

27、都是一維數(shù)組名,同樣也代表一個(gè)不可改變的地址常量,其值依次為二維數(shù)組每行第一個(gè)元素的地址,代表一個(gè)不可改變的地址常量,其值依次為二維數(shù)組每行第一個(gè)元素的地址,其基類型就是數(shù)組元素的類型。因此,對(duì)于二維數(shù)組,象其基類型就是數(shù)組元素的類型。因此,對(duì)于二維數(shù)組,象a0+這樣的表達(dá)式這樣的表達(dá)式是非法的。是非法的。在以上定義中,指針變量在以上定義中,指針變量p的基類型與的基類型與ai(0i3)相同,因此,賦值語(yǔ)句)相同,因此,賦值語(yǔ)句p=ai;是合法的,我們已知;是合法的,我們已知ai也可以寫(xiě)成:也可以寫(xiě)成:*(a+i),故以上賦值語(yǔ)句也可寫(xiě),故以上賦值語(yǔ)句也可寫(xiě)成成p=*(a+i);(2)二維數(shù)組元

28、素的地址)二維數(shù)組元素的地址二維數(shù)組元素的地址可以由表達(dá)式二維數(shù)組元素的地址可以由表達(dá)式&aij求得;也可以通過(guò)每行的首地址表示。求得;也可以通過(guò)每行的首地址表示。以上二維數(shù)組以上二維數(shù)組a 中,每個(gè)元素的地址可以通過(guò)每行的首地址:中,每個(gè)元素的地址可以通過(guò)每行的首地址:a0、 a1、 a2等來(lái)表示。如地址等來(lái)表示。如地址&a00可以用可以用a0+0來(lái)表示,地址來(lái)表示,地址&a01可以用可以用a0+1表表示;若示;若0i3、0j4,則,則aij的地址可用以下表達(dá)式求得:的地址可用以下表達(dá)式求得: &aij ai+j *(a+i)+j上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回2通過(guò)地址引用二維數(shù)組元素通

29、過(guò)地址引用二維數(shù)組元素若有以下定義:若有以下定義:int a34,i,j;且當(dāng)且當(dāng)0i3、0j4,則,則a數(shù)組元素可用以下三種表達(dá)式來(lái)引用:數(shù)組元素可用以下三種表達(dá)式來(lái)引用: aij *(ai+j) *(*(a+i)+j)說(shuō)明:說(shuō)明:在在中,表達(dá)式中,表達(dá)式*(ai+j)中因?yàn)橹幸驗(yàn)閍i的基類型為的基類型為int ,j的位移量為的位移量為4*j字節(jié)。字節(jié)。在在中,表達(dá)式中,表達(dá)式*(*(a+i)+j)中,)中,a 的基類型為的基類型為4個(gè)元素的一維數(shù)組,個(gè)元素的一維數(shù)組,i的位的位移量為移量為4*4*i字節(jié);而字節(jié);而*(a+i)的基類型為)的基類型為int,j的位移量為的位移量為4*j字節(jié)。

30、字節(jié)。上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.6】 分析下列程序的輸出結(jié)果。分析下列程序的輸出結(jié)果。【程序代碼】【程序代碼】#include stdio.hmain( ) int b34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j;for(i=0;i3;i+) for(j=0;j4;j+)printf(%5d,*(*(b+i)+j);printf(n);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下: 3通過(guò)建立一個(gè)指針數(shù)組來(lái)引用二維數(shù)組元素通過(guò)建立一個(gè)指針數(shù)組來(lái)引用二維數(shù)組元素當(dāng)當(dāng)個(gè)數(shù)組的元素類型為某種指針類型時(shí),該數(shù)組就稱為指針數(shù)組。指針數(shù)個(gè)數(shù)

31、組的元素類型為某種指針類型時(shí),該數(shù)組就稱為指針數(shù)組。指針數(shù)組的定義形式為:組的定義形式為:類型名類型名 *數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式 ;例如例如 int *p3,a32,i,j;定義指針數(shù)組定義指針數(shù)組p,它有,它有3個(gè)元素,每個(gè)元素都是指向個(gè)元素,每個(gè)元素都是指向int型變量的指針變量。和型變量的指針變量。和一般的數(shù)組定義一樣,數(shù)組名一般的數(shù)組定義一樣,數(shù)組名p是第一個(gè)元素即是第一個(gè)元素即p0的地址,也是地址常量。的地址,也是地址常量。若滿足條件若滿足條件0i3,則,則pi和和ai的基類型相同,的基類型相同,pi=ai是合法的賦值表達(dá)式。是合法的賦值表達(dá)式。若有以下循環(huán):若有以下循環(huán):

32、for(i=0;i3;i+) pi=ai;在這里,賦值號(hào)右邊的在這里,賦值號(hào)右邊的ai是常量,表示是常量,表示a數(shù)組每行的首地址,賦值號(hào)左邊的數(shù)組每行的首地址,賦值號(hào)左邊的pi是指針變量,循環(huán)執(zhí)行的結(jié)果使是指針變量,循環(huán)執(zhí)行的結(jié)果使p0、p1、p2分別指向分別指向a數(shù)組每行的開(kāi)數(shù)組每行的開(kāi)頭。這時(shí),數(shù)組頭。這時(shí),數(shù)組aij的引用形式的引用形式*(ai+j)和和*(pi+j)是完全等價(jià)的。由此可見(jiàn),是完全等價(jià)的。由此可見(jiàn),這時(shí)可以通過(guò)指針數(shù)組這時(shí)可以通過(guò)指針數(shù)組p來(lái)引用來(lái)引用a數(shù)組的元素,它們的等價(jià)形式如下:數(shù)組的元素,它們的等價(jià)形式如下: pij /* 與與aij對(duì)應(yīng)對(duì)應(yīng) */ *(pi+j)

33、 /* 與與*(ai+j)對(duì)應(yīng)對(duì)應(yīng) */*(*(p+i)+j) /* 與與*(*(a+i)+j)對(duì)應(yīng)對(duì)應(yīng) */不同的是:不同的是:pi中的值是可變的,而中的值是可變的,而ai 的值是不可變的。的值是不可變的。 上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.7】 分析下列程序的輸出結(jié)果。分析下列程序的輸出結(jié)果?!境绦虼a】【程序代碼】#include stdio.hmain( ) int a23=1,2,3,4,5,6;int i, *p2;for(i=0;i2;i+)pi=ai;printf(%d, %dn,p11,*(p1+2);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:

34、該程序中該程序中p是一個(gè)一維指針數(shù)組名,它有是一個(gè)一維指針數(shù)組名,它有2個(gè)元素,每個(gè)元素是指向個(gè)元素,每個(gè)元素是指向int型的型的指針。通過(guò)指針。通過(guò)for循環(huán)給循環(huán)給p數(shù)組賦值,分別使數(shù)組賦值,分別使p0賦值為賦值為a0,pl賦值為賦值為a1。上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回 4通過(guò)建立一個(gè)行指針來(lái)引用二維數(shù)組元素通過(guò)建立一個(gè)行指針來(lái)引用二維數(shù)組元素 在在C語(yǔ)言中,對(duì)于某類型的二維數(shù)組語(yǔ)言中,對(duì)于某類型的二維數(shù)組amn的數(shù)組名的數(shù)組名a,在表達(dá)式中出,在表達(dá)式中出現(xiàn)時(shí),被轉(zhuǎn)換成指向現(xiàn)時(shí),被轉(zhuǎn)換成指向n個(gè)元素組成的一維數(shù)組的指針,該一維數(shù)組是由個(gè)元素組成的一維數(shù)組的指針,該一維數(shù)組是由a00

35、,a01, ,a0n-1 n個(gè)元素組成的,這時(shí)個(gè)元素組成的,這時(shí)a+1就指向另一個(gè)一維數(shù)組就指向另一個(gè)一維數(shù)組a10,a11, ,a1n-1的指針;的指針;a+2就是指向下一個(gè)一維數(shù)組就是指向下一個(gè)一維數(shù)組a20,a21, ,a2n-1的指針;的指針;a+(m-1)就是指向數(shù)組就是指向數(shù)組am-10,am-11, ,am-1n-1的指針。由此可見(jiàn),的指針。由此可見(jiàn),a 的指向是以一個(gè)由若干元素組的指向是以一個(gè)由若干元素組成的一維數(shù)組(或二維數(shù)組的一行)為單位的,成的一維數(shù)組(或二維數(shù)組的一行)為單位的,a 不可能指向某一行的某個(gè)不可能指向某一行的某個(gè)字符,這種指向二維數(shù)組每一行的指針?lè)Q行指針,

36、其定義的一般形式為:字符,這種指向二維數(shù)組每一行的指針?lè)Q行指針,其定義的一般形式為:類型名(類型名(*指針變量名)常量表達(dá)式,指針變量名)常量表達(dá)式,;其中其中“常量表達(dá)式常量表達(dá)式”為二維數(shù)組中每一行中元素的個(gè)數(shù),即與列下標(biāo)同值。為二維數(shù)組中每一行中元素的個(gè)數(shù),即與列下標(biāo)同值。 若有以下定義:若有以下定義:int a32, (*prt)2;上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回其中在其中在(*prt)2說(shuō)明符中,由于一對(duì)圓括號(hào)的存在,使說(shuō)明符中,由于一對(duì)圓括號(hào)的存在,使“*”首先與指針變量首先與指針變量名名prt結(jié)合,說(shuō)明結(jié)合,說(shuō)明prt是一個(gè)指針變量,然后再與說(shuō)明符是一個(gè)指針變量,然后再與說(shuō)明

37、符2結(jié)合,說(shuō)明指針變結(jié)合,說(shuō)明指針變量量prt的基類型是一個(gè)包含兩個(gè)的基類型是一個(gè)包含兩個(gè)int 元素的數(shù)組。在這里,元素的數(shù)組。在這里,prt的基類型與數(shù)的基類型與數(shù)組名組名a的基類型相同,因此的基類型相同,因此prt=a;是合法的賦值語(yǔ)句。所以;是合法的賦值語(yǔ)句。所以prt+1a+1a1。當(dāng)。當(dāng)prt指向指向a數(shù)組開(kāi)頭時(shí),即數(shù)組開(kāi)頭時(shí),即prt=a;時(shí),則可用以下;時(shí),則可用以下形式來(lái)引用二維數(shù)組元素形式來(lái)引用二維數(shù)組元素aij: prtij /* 與與aij對(duì)應(yīng)對(duì)應(yīng) */ *(prti+j) /* 與與*(ai+j)對(duì)應(yīng)對(duì)應(yīng) */*(*(prt+i)+j) /* 與與*(*(a+i)+j

38、)對(duì)應(yīng)對(duì)應(yīng) */在這里,在這里,prt是指針變量,它的值可變,而是指針變量,它的值可變,而a是一個(gè)地址常量。是一個(gè)地址常量?!纠纠?.8】 分析下列程序的輸出結(jié)果。分析下列程序的輸出結(jié)果?!境绦虼a】【程序代碼】#include stdio.hmain( ) int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;int (*p)5;p=a+1;printf(%d,%dn,p00,*(*(p+1)+1);上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:字符數(shù)組通常用來(lái)存放字符串,指針指向字符數(shù)組也就指向了字符串,因此字符數(shù)組通常用來(lái)存放字符串,指

39、針指向字符數(shù)組也就指向了字符串,因此通過(guò)指針可以引用它所指向的字符串,本節(jié)主要講指向字符串指針的定義、通過(guò)指針可以引用它所指向的字符串,本節(jié)主要講指向字符串指針的定義、賦值及引用方法。賦值及引用方法。1指向字符串指針變量的定義及賦值指向字符串指針變量的定義及賦值定義的一般形式如下:定義的一般形式如下:char *指針變量;指針變量;如:如:char *ps1,*ps2=abcd;以上的定義中以上的定義中ps2在定義的同時(shí)直接賦了初值在定義的同時(shí)直接賦了初值abcd,既將存放字符串的存,既將存放字符串的存儲(chǔ)單元起始地址直接賦給了指針變量?jī)?chǔ)單元起始地址直接賦給了指針變量ps2。如果已經(jīng)定義了一個(gè)字

40、符型指針變量,也可以通過(guò)賦值運(yùn)算將某個(gè)字符串的如果已經(jīng)定義了一個(gè)字符型指針變量,也可以通過(guò)賦值運(yùn)算將某個(gè)字符串的起始地址賦給它,從而使指針指向一個(gè)字符串,如:起始地址賦給它,從而使指針指向一個(gè)字符串,如:char *ps1; ps1=abcd;8.3 指針與字符串指針與字符串上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回 2字符指針的引用字符指針的引用當(dāng)一個(gè)字符型指針變量指向了某個(gè)字符串后,就可以利用指針變量來(lái)處理這當(dāng)一個(gè)字符型指針變量指向了某個(gè)字符串后,就可以利用指針變量來(lái)處理這個(gè)字符串。主要有兩種處理方式:個(gè)字符串。主要有兩種處理方式:(1)整體處理字符串)整體處理字符串輸出字符串輸出字符串 prin

41、tf(%s,指針變量指針變量);或;或puts(指針變量指針變量);輸入字符串輸入字符串 scanf(%s,指針變量,指針變量);或;或gets(指針變量指針變量);(2)單個(gè)處理字符串中的字符)單個(gè)處理字符串中的字符引用第引用第i個(gè)字符的格式為:個(gè)字符的格式為:*(指針變量指針變量+i);【例【例8.9】 利用指針實(shí)現(xiàn)兩個(gè)字符串的連接利用指針實(shí)現(xiàn)兩個(gè)字符串的連接【編程思路】【編程思路】(1)指針)指針p指向第一個(gè)串末尾(最后一個(gè)字符的后面),指針指向第一個(gè)串末尾(最后一個(gè)字符的后面),指針q指向第二個(gè)指向第二個(gè)串的首部。串的首部。(2)將第二個(gè)串中字符依次放入第一個(gè)串后。)將第二個(gè)串中字符依

42、次放入第一個(gè)串后。上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【程序代碼】【程序代碼】#include stdio.h#include string.hmain()char str120,str210,*p,*q;printf(請(qǐng)輸入兩個(gè)字符串:請(qǐng)輸入兩個(gè)字符串:);gets(str1);gets(str2);p=str1+strlen(str1); /*p指向第一個(gè)串的末尾指向第一個(gè)串的末尾*/q=str2;while(*q!=0)*p=*q;p+;q+;*p=0;printf(連接后的串為:連接后的串為:);puts(str1);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例

43、8.10】 通過(guò)指針以單個(gè)字符的形式輸出一個(gè)字符串通過(guò)指針以單個(gè)字符的形式輸出一個(gè)字符串【程序代碼】【程序代碼】#include stdio.h#include string.hmain( )char c10,*p;int i,len;printf(輸入字符串為:輸入字符串為:n);gets(c);p=c;len=strlen(c);printf(輸出字符串為:輸出字符串為:n);for(i=0;ilen;i+) printf(%c,*(p+i);printf(n);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回使用指針作函數(shù)的形參時(shí),實(shí)參要求使用地址值,從而實(shí)現(xiàn)變量地址的傳使

44、用指針作函數(shù)的形參時(shí),實(shí)參要求使用地址值,從而實(shí)現(xiàn)變量地址的傳遞,這種調(diào)用稱為傳址調(diào)用。它的特點(diǎn)是可以在被調(diào)用函數(shù)中通過(guò)改變形遞,這種調(diào)用稱為傳址調(diào)用。它的特點(diǎn)是可以在被調(diào)用函數(shù)中通過(guò)改變形參所指的變量的值,來(lái)改變調(diào)用函數(shù)中實(shí)參所指的變量的值。參所指的變量的值,來(lái)改變調(diào)用函數(shù)中實(shí)參所指的變量的值。1變量地址作函數(shù)參數(shù)變量地址作函數(shù)參數(shù)當(dāng)實(shí)參為一個(gè)變量的地址(或已經(jīng)指向某變量的指針變量)時(shí),形參必須當(dāng)實(shí)參為一個(gè)變量的地址(或已經(jīng)指向某變量的指針變量)時(shí),形參必須是一個(gè)基類型與它相同的指針變量。是一個(gè)基類型與它相同的指針變量。8.4 指針與函數(shù)指針與函數(shù)8.4.1 指針作函數(shù)的參數(shù)指針作函數(shù)的參數(shù)

45、上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.11】 分析下列程序輸出結(jié)果分析下列程序輸出結(jié)果【程序代碼】【程序代碼】#include stdio.hmain( ) int a,b,c;a=b=c=5;fun(a,&b,&c);printf(%d,%d,%dn,a,b,c);fun(int x,int *y,int *z) x*=2;*y+=x;*z=x+*y;printf(%d,%d,%dn,x,*y,*z);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回2數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)(1)一維數(shù)組名作實(shí)參)一維數(shù)組名作實(shí)參【例【例8.12】 編寫(xiě)程序,調(diào)用函數(shù)輸出數(shù)組中

46、的數(shù)據(jù)。編寫(xiě)程序,調(diào)用函數(shù)輸出數(shù)組中的數(shù)據(jù)。【程序代碼】【程序代碼】#include stdio.h#define M 10void arrout(int *);main( ) int sM=1,2,3,4,5,6,7,8,9,10;arrout(s);void arrout(int *a) int i;for(i=0;iM;i+)printf(i+1)%5= =0)? %4dn: %4d,*(a+i); /* 根據(jù)根據(jù)i的值來(lái)確定使用不同的格式串的值來(lái)確定使用不同的格式串 */printf(n);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回當(dāng)數(shù)組名作實(shí)參時(shí),對(duì)應(yīng)的形參除了應(yīng)

47、該是指針外,形參還可以用另外兩種當(dāng)數(shù)組名作實(shí)參時(shí),對(duì)應(yīng)的形參除了應(yīng)該是指針外,形參還可以用另外兩種形式。對(duì)于上例中的函數(shù)調(diào)用形式。對(duì)于上例中的函數(shù)調(diào)用arrout(s),對(duì)應(yīng)的函數(shù)首部可以寫(xiě)成以下三種,對(duì)應(yīng)的函數(shù)首部可以寫(xiě)成以下三種形式:形式: arrout(int *a) arrout(int a ) arrout(int aM)在第在第和第和第種形式中,雖然說(shuō)明形式與數(shù)組說(shuō)明相同,但種形式中,雖然說(shuō)明形式與數(shù)組說(shuō)明相同,但C編譯程序都把編譯程序都把a(bǔ)處理成第一種指針形式。處理成第一種指針形式。(2)二維數(shù)組名作實(shí)參)二維數(shù)組名作實(shí)參當(dāng)二維數(shù)組名作實(shí)參時(shí),對(duì)應(yīng)的形參必須是一個(gè)行指針變量,例如

48、,主函數(shù)當(dāng)二維數(shù)組名作實(shí)參時(shí),對(duì)應(yīng)的形參必須是一個(gè)行指針變量,例如,主函數(shù)中以下的定義和調(diào)用語(yǔ)句:中以下的定義和調(diào)用語(yǔ)句:#define M 5#define N 3main( ) double sMN;fun(s);上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回則則fun函數(shù)的首部可以是以下三種形式之一:函數(shù)的首部可以是以下三種形式之一: fun(double (*a)N) fun(double a N) fun(double aMN)注意:列下標(biāo)不可缺。無(wú)論是哪種方式,系統(tǒng)都把注意:列下標(biāo)不可缺。無(wú)論是哪種方式,系統(tǒng)都把a(bǔ)處理成一個(gè)行指針。和一處理成一個(gè)行指針。和一維數(shù)組相同,數(shù)組名傳送給函數(shù)的是一個(gè)

49、地址值,因此,對(duì)應(yīng)的形參也必定維數(shù)組相同,數(shù)組名傳送給函數(shù)的是一個(gè)地址值,因此,對(duì)應(yīng)的形參也必定是一個(gè)基類型相同的指針變量,在函數(shù)中引用的將是主函數(shù)中的數(shù)組元素,是一個(gè)基類型相同的指針變量,在函數(shù)中引用的將是主函數(shù)中的數(shù)組元素,系統(tǒng)只為形參開(kāi)辟一個(gè)存放地址的存儲(chǔ)單元,而不可能在調(diào)用函數(shù)時(shí)為形參系統(tǒng)只為形參開(kāi)辟一個(gè)存放地址的存儲(chǔ)單元,而不可能在調(diào)用函數(shù)時(shí)為形參開(kāi)辟一系列存放數(shù)組的存儲(chǔ)單元。開(kāi)辟一系列存放數(shù)組的存儲(chǔ)單元。 上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.13】 假定有假定有5個(gè)學(xué)生,每個(gè)學(xué)生有個(gè)學(xué)生,每個(gè)學(xué)生有3門(mén)課的成績(jī),編程輸出某個(gè)學(xué)生的門(mén)課的成績(jī),編程輸出某個(gè)學(xué)生的成績(jī)。成績(jī)。

50、【程序代碼】【程序代碼】#include stdio.hsearch(float (*p)3, int a) int i;printf(the scores of student NO. %d are:n,a);for(i=0;i3;i+)printf(%5.1f,pa-1i);printf(n);main( ) float score53=86,90,78,86,84,96,9l,76,88,90,77,66,78,97,68;int n;printf(input student No.(1-5):);scanf(%d,&n);search(score,n);運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一

51、頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回 在在C語(yǔ)言中,函數(shù)可以返回整型值、字符值、實(shí)型值等,也可以返回某種語(yǔ)言中,函數(shù)可以返回整型值、字符值、實(shí)型值等,也可以返回某種基類型的指針值,即地址。返回指針值的函數(shù)與以前介紹的函數(shù)在概念上是基類型的指針值,即地址。返回指針值的函數(shù)與以前介紹的函數(shù)在概念上是完全一致的,只是對(duì)這類函數(shù)的調(diào)用,其返回值的類型是某種指針類型而已。完全一致的,只是對(duì)這類函數(shù)的調(diào)用,其返回值的類型是某種指針類型而已。定義返回指針值的函數(shù),一般形式為:定義返回指針值的函數(shù),一般形式為: 類型名類型名 *函數(shù)名函數(shù)名(形參表形參表) 例如:例如: int *f(int x, int y) 函

52、數(shù)函數(shù)f( )返回指向返回指向int型數(shù)據(jù)的指針,其中型數(shù)據(jù)的指針,其中x,y是函數(shù)是函數(shù)f( )的形參,注意在的形參,注意在函數(shù)名的兩側(cè)分別為函數(shù)名的兩側(cè)分別為“*”運(yùn)算符和運(yùn)算符和“( )”運(yùn)算符,由于運(yùn)算符,由于“( )”的優(yōu)先級(jí)高于的優(yōu)先級(jí)高于“*”,因此,函數(shù)名先與因此,函數(shù)名先與“( )”結(jié)合,在函數(shù)名之前的結(jié)合,在函數(shù)名之前的*,表示函數(shù)返回值為指針類型。,表示函數(shù)返回值為指針類型。8.4.2 返回指針值的函數(shù)返回指針值的函數(shù)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.14】對(duì)例】對(duì)例8.13 用返回指針值的函數(shù)來(lái)實(shí)現(xiàn)。用返回指針值的函數(shù)來(lái)實(shí)現(xiàn)。 【程序代碼】【程序代碼】#in

53、clude stdio.hmain( ) float score53=86,90,78,86,84,96,9l,76,88,90,77,66,78,97,68;float *search( float (*)3,int);float *p; int i,n;printf(input student No.(1-5):);scanf(%d,&n);printf(The scores of student NO. %d are:n,n);p=search(score,n);for(i=0;i3;i+)printf(%5.2ft,*(p+i);printf(n);float *search(floa

54、t (* pointer)3,int n) float *pt;pt=*(pointer+n-1); return(pt);上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:注意:學(xué)生序號(hào)是從注意:學(xué)生序號(hào)是從0號(hào)算起。函數(shù)號(hào)算起。函數(shù)search被定義為指針型函數(shù),它的形被定義為指針型函數(shù),它的形參參pointer是指向包含是指向包含3個(gè)元素的一維數(shù)組的指針變量。個(gè)元素的一維數(shù)組的指針變量。pointer+1指向指向score數(shù)組第一行。數(shù)組第一行。*(pointer+1)指向第)指向第1行第行第0列元素。列元素。pt是指針變量,是指針變量,它指向?qū)嵭妥兞浚ǘ皇侵赶蛞痪S數(shù)組)。

55、它指向?qū)嵭妥兞浚ǘ皇侵赶蛞痪S數(shù)組)。main函數(shù)調(diào)用函數(shù)調(diào)用search函數(shù),函數(shù),將將score數(shù)組的首地址傳給數(shù)組的首地址傳給pointer(注意注意score也是指向行的指針,而不是也是指向行的指針,而不是指向列元素的指針指向列元素的指針)。n是要查找的學(xué)生序號(hào)。調(diào)用是要查找的學(xué)生序號(hào)。調(diào)用search函數(shù)后,得到函數(shù)后,得到一個(gè)地址(指向第一個(gè)地址(指向第n個(gè)學(xué)生第個(gè)學(xué)生第0門(mén)課程),賦給門(mén)課程),賦給p。然后將此學(xué)生的。然后將此學(xué)生的3門(mén)課門(mén)課的成績(jī)打印出來(lái)。的成績(jī)打印出來(lái)。*(p+i)表示此學(xué)生第)表示此學(xué)生第i門(mén)課的成績(jī)。門(mén)課的成績(jī)。上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回1指向函數(shù)

56、的指針變量的定義指向函數(shù)的指針變量的定義在在C語(yǔ)言中,指針變量除能指向數(shù)據(jù)對(duì)象外,也可指向函數(shù)。一個(gè)函數(shù)在語(yǔ)言中,指針變量除能指向數(shù)據(jù)對(duì)象外,也可指向函數(shù)。一個(gè)函數(shù)在編譯時(shí),被分配給一個(gè)入口地址這個(gè)入口地址就稱為函數(shù)的指針。函數(shù)編譯時(shí),被分配給一個(gè)入口地址這個(gè)入口地址就稱為函數(shù)的指針。函數(shù)的指針能賦給一個(gè)指向函數(shù)的指針變量,并能通過(guò)指向函數(shù)的指針變量調(diào)的指針能賦給一個(gè)指向函數(shù)的指針變量,并能通過(guò)指向函數(shù)的指針變量調(diào)用它所指向的函數(shù)。用它所指向的函數(shù)。定義指向函數(shù)的指針變量的一般形式為:定義指向函數(shù)的指針變量的一般形式為:類型名類型名 (*指針變量名指針變量名)(形參形參1類型,形參類型,形參2

57、類型類型 );例如:例如:int (*p)( );定義了一個(gè)指向函數(shù)的指針變量定義了一個(gè)指向函數(shù)的指針變量p,它用于指向一個(gè)函數(shù)返回值為,它用于指向一個(gè)函數(shù)返回值為int型的型的函數(shù),注意,函數(shù),注意,*p兩側(cè)的括號(hào)是必需的,表示兩側(cè)的括號(hào)是必需的,表示p先與先與*結(jié)合,是結(jié)合,是個(gè)指針變量。個(gè)指針變量。然后與隨后的然后與隨后的( )結(jié)合,表示指針變量結(jié)合,表示指針變量p所指向的對(duì)象是函數(shù)。如果寫(xiě)成所指向的對(duì)象是函數(shù)。如果寫(xiě)成“int *p( )”,因,因“( )”優(yōu)先級(jí)高于優(yōu)先級(jí)高于“*”,就變成是說(shuō)明一個(gè)函數(shù),就變成是說(shuō)明一個(gè)函數(shù)p( ),該函,該函數(shù)的返回值是指向數(shù)的返回值是指向int型

58、的指針。型的指針。8.4.3 指向函數(shù)的指針變量指向函數(shù)的指針變量上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回2用指向函數(shù)的指針變量調(diào)用函數(shù)用指向函數(shù)的指針變量調(diào)用函數(shù) C語(yǔ)言約定,函數(shù)名本身就是函數(shù)入口地址,這如同數(shù)組名是數(shù)組存語(yǔ)言約定,函數(shù)名本身就是函數(shù)入口地址,這如同數(shù)組名是數(shù)組存儲(chǔ)區(qū)域的起始地址一樣。儲(chǔ)區(qū)域的起始地址一樣。 指向函數(shù)的指針變量并不固定指向某個(gè)函數(shù),在程序中把哪個(gè)函數(shù)指向函數(shù)的指針變量并不固定指向某個(gè)函數(shù),在程序中把哪個(gè)函數(shù)的入口地址賦給它,它就指向哪個(gè)函數(shù)。并可根據(jù)需要向它賦不同函數(shù)入的入口地址賦給它,它就指向哪個(gè)函數(shù)。并可根據(jù)需要向它賦不同函數(shù)入口的地址,使它指向不同的函數(shù)???/p>

59、的地址,使它指向不同的函數(shù)。 通過(guò)指向函數(shù)的指針變量調(diào)用其所指的函數(shù),一般形式為:通過(guò)指向函數(shù)的指針變量調(diào)用其所指的函數(shù),一般形式為: (*指針變量名指針變量名)(實(shí)參表實(shí)參表)或或 指針變量名指針變量名(實(shí)參表實(shí)參表)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回【例【例8.15】 求求x,y中的較小數(shù)中的較小數(shù)【程序代碼】【程序代碼】#include stdio.hmain( ) int min(int ,int); int (*p)(int ,int),x,y,z;printf(Enter x,y:);scanf(%d%d,&x,&y);p=min;z=(*p)(x,y);printf(Min(%d

60、,%d)=%dn,x,y,z);int min(int a,int b) return ab?a:b; 運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)返返 回回例例8.16編寫(xiě)程序,利用指針實(shí)現(xiàn)把一個(gè)數(shù)組中的偶數(shù)存入另一個(gè)數(shù)組中并編寫(xiě)程序,利用指針實(shí)現(xiàn)把一個(gè)數(shù)組中的偶數(shù)存入另一個(gè)數(shù)組中并輸入此新數(shù)組中的內(nèi)容。輸入此新數(shù)組中的內(nèi)容?!揪幊趟悸贰俊揪幊趟悸贰浚?)用兩個(gè)指針)用兩個(gè)指針p1和和p2分別指向數(shù)組分別指向數(shù)組x和和y。(2)利用指針移動(dòng)逐個(gè)取出數(shù)組)利用指針移動(dòng)逐個(gè)取出數(shù)組x中的每個(gè)元素,如果當(dāng)前元素的值為中的每個(gè)元素,如果當(dāng)前元素的值為偶數(shù),則存入數(shù)組偶數(shù),則存入數(shù)組y中。中。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論