版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第8 8章章 指指 針針 本章學(xué)習(xí)意圖本章學(xué)習(xí)意圖深刻懂得地址和指針的概念深刻懂得地址和指針的概念.諳練把握變量的指針和指向變量的指針變諳練把握變量的指針和指向變量的指針變量的使用量的使用.諳練把握數(shù)組的指針和指向數(shù)組的指針變諳練把握數(shù)組的指針和指向數(shù)組的指針變量的使用量的使用.把握字符串的指針和指向字符串的指針變把握字符串的指針和指向字符串的指針變量的使用量的使用.諳練把握函數(shù)的指針和指向函數(shù)的指針變諳練把握函數(shù)的指針和指向函數(shù)的指針變量的使用量的使用.把握返回指針值的函數(shù)的定義方式把握返回指針值的函數(shù)的定義方式.把握指針數(shù)組和指向指針的指針的使用把握指針數(shù)組和指向指針的指針的使用.Ret
2、urn8.1 啥是指針 8.2 指針和指針變量 8.3 數(shù)組指針 8.4 字符串指針 8.5 函數(shù)指針 8.6 返回指針值的函數(shù) 8.7 指針數(shù)組和指向指針的指針 8.8 指針應(yīng)用舉例 8.1 啥是指針 1.內(nèi)存地址內(nèi)存中存儲(chǔ)單元的編號(hào)(1)統(tǒng)計(jì)機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中,擁有大量的存儲(chǔ)單元(容量為字節(jié)).為了方便經(jīng)管,必須為每一個(gè)存儲(chǔ)單元編號(hào),那個(gè)編號(hào)便是存儲(chǔ)單元的“地址”.每個(gè)存儲(chǔ)單元都有一個(gè)惟一的地址.(2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放信息.注重:內(nèi)存單元的地址與內(nèi)存單元中的信息是兩個(gè)完全差別的概念.2.變量地址系統(tǒng)安排給變量的內(nèi)存單元的起始地址.如果程序中有如此的定義:int a=1,b=
3、2;float x=3.4;char ch1=c,ch2=d;設(shè)變量的存放從內(nèi)存2000單元最先存放,那么編譯系統(tǒng)為變量安排內(nèi)存的情況似圖8-1所示.似變量a 在內(nèi)存的地址是2000,占據(jù)兩個(gè)字節(jié),變量b的內(nèi)存地址便為2021,變量x的內(nèi)存地址為2021等. 變量變量ch2ch2d變量變量ch1ch1c200020001變量變量a a202120212變量變量b b202120213.4變量變量x x2021202120212021圖圖8-1 8-1 變量在內(nèi)存中占用的空間變量在內(nèi)存中占用的空間3.變量值的存取通過變量在內(nèi)存中的地址履行 對(duì)變量的會(huì)見第一步應(yīng)尋到其在內(nèi)存的地址,大概講,一個(gè)地址
4、唯獨(dú)指向一個(gè)內(nèi)存變量,我們稱那個(gè)地址為變量的指針.(1)直截了當(dāng)會(huì)見直截了當(dāng)操縱變量的地址履行存取 似scanf(“%d”,&a);語句的履行環(huán)節(jié)是如此的:第一步尋到變量a的起始地址2000,接著將鍵盤輸入的值(假定為1)送到內(nèi)存單元2000和2001中.此刻變量a在內(nèi)存中的地址和值似圖8-1所示.(2)間接會(huì)見通過另一變量會(huì)見該變量的值似果將變量的地址保留在內(nèi)存的特定區(qū)域,用變量來存放這些地址,如此的變量便是指針變量,通過指面向所指向變量的會(huì)見,也便是一種對(duì)變量的“間接會(huì)見”. 設(shè)有指針變量pa、pb,分不指向上述的變量a、b,指針變量也同樣被存放在內(nèi)存中,二者的關(guān)系似圖8-2所示,
5、指針變量pa、pb分不存儲(chǔ)了變量a、b的地址,我們便信任變量pa、pb分不指向了變量a、b,那么pa、pb便是變量a、b的指針.對(duì)變量a、b的會(huì)見,也能夠通過指針變量pa、pb間接履行,下節(jié)將給出這一方式. pbpbpapa20212000變量變量ch2ch2d變量變量ch1ch1c200020001變量變量a a202120212變量變量b b202120213.4變量變量x x20212021202120211000100010021002圖圖8-28-2指針變量與變量在內(nèi)存中的關(guān)系指針變量與變量在內(nèi)存中的關(guān)系Return8.2 指針和指針變量 變量的指針便是變量的地址,存放變量地址的變量
6、是指針變量,用來指向另一個(gè)變量. 8.2.1 8.2.1 指針變量的定義與初始化指針變量的定義與初始化1指針變量的定義指針變量與一樣一樣變量一樣,必須先講明后使用.指針變量講明的形式為:類型講明符 * 指針變量名;其中指針變量名前面的“*”講明該變量為指針類型的變量,稱為指針變量.指針變量也具有類型,其類型是指針變量所指對(duì)象的類型. C語言中許可指針指向任何類型的對(duì)象,包羅變量、數(shù)組、函數(shù)、結(jié)構(gòu)、或另外的指針變量等. 例似:int *ptr1;float *ptr2;char *ptr3;示意定義了三個(gè)指針變量ptr1、ptr2、ptr3.ptr1能夠指向一個(gè)整型變量,ptr2能夠指向一個(gè)實(shí)型
7、變量,ptr3能夠指向一個(gè)字符型變量,換句話講,ptr1、ptr2、ptr3能夠分不存放整型變量的地址、實(shí)型變量的地址、字符型變量的地址. 2指針變量的初始化在使用指針變量時(shí),要第一步對(duì)指針變量履行初始化,讓指針變量指向一個(gè)具體的變量.履行指針變量初始化的方式有兩種:(1)使用賦值語句履行指針初始化.int a,*pa; *定義指針變量pa和變量a*pa=&a ; *將變量a的地址賦給指針pa* (2)在定義指針變量的時(shí)侯同時(shí)履行初始化.int a ,*pa=&a;注重不要與一樣的賦值語句混淆,示意成: int a,*pa; *pa=&a;是錯(cuò)誤的 注重:當(dāng)定義指針變量
8、時(shí),指針變量的值是隨機(jī)的,不能確定它具體的指向,必須為其賦值,才有意義,否那么會(huì)產(chǎn)生意料不到的后果.8.2.2 8.2.2 指針變量的引用指針變量的引用C C語言提供了兩種與指針有關(guān)的運(yùn)算符語言提供了兩種與指針有關(guān)的運(yùn)算符: :&:&:取地址運(yùn)算符取地址運(yùn)算符* *: :指針內(nèi)容運(yùn)算符指針內(nèi)容運(yùn)算符( (也稱間接存取運(yùn)算符也稱間接存取運(yùn)算符) )對(duì)指針變量的引用形式為對(duì)指針變量的引用形式為: :* * 指針變量指針變量其含義是指針變量所指向的存儲(chǔ)單元所存放的值其含義是指針變量所指向的存儲(chǔ)單元所存放的值, ,這個(gè)這個(gè)地方的地方的“* *”與定義指針變量時(shí)表現(xiàn)的與定義指針變量時(shí)表現(xiàn)
9、的“* *”的含義是的含義是差別的差別的, ,定義語句中的定義語句中的“* *”是一個(gè)標(biāo)記是一個(gè)標(biāo)記, ,示意緊隨其后示意緊隨其后的變量是指針變量的變量是指針變量, ,而這個(gè)地方的而這個(gè)地方的“* *”是一個(gè)指針運(yùn)是一個(gè)指針運(yùn)算符算符. .【例【例8-18-1】用指針變量履行輸入、輸出】用指針變量履行輸入、輸出. . * *exam8_1exam8_1* *#include stdio.h #include stdio.h int main(void)int main(void) int int * *p,m;p,m; scanf(%d,&m); scanf(%d,&m); p
10、=&m; p=&m; * *指針指針p p指向變量指向變量m m * * printf(“%d”, printf(“%d”,* *p); p); * *(* *p p)是對(duì)指針)是對(duì)指針p p所指的變量的引用形所指的變量的引用形 式式, ,與與m m意義一樣意義一樣* * return 0; return 0; 3 3運(yùn)行結(jié)論:演示【例【例8-28-2】從鍵盤輸入兩個(gè)整數(shù)】從鍵盤輸入兩個(gè)整數(shù), ,按由大到小的次序輸出按由大到小的次序輸出. . * *exam8_2exam8_2* *#include stdio.h #include stdio.h int main(void)
11、int main(void) int int * *p1,p1,* *p2,a,b,t; p2,a,b,t; * *定義指針變量與整型變量定義指針變量與整型變量* * printf(“enter two numbers: ”); printf(“enter two numbers: ”); scanf(%d,%d,&a,&b ) ; scanf(%d,%d,&a,&b ) ; p1=&a; p1=&a; * *使指針變量指向整型變量使指針變量指向整型變量a a* * p2=&b ; p2=&b ; * *使指針變量指向整型變量使指
12、針變量指向整型變量b b* * if( if(* *p1p1* *p2) p2) * *交流指針變量指向的整型變量交流指針變量指向的整型變量* *t=t=* *p1 ;p1 ;* *p1=p1=* *p2 ;p2 ;* *p2=t ;p2=t ; printf(%d,%dn,a,b) ; printf(%d,%dn,a,b) ; return 0; return 0; enter two numbers: 3 , 4 4 , 3演示運(yùn)行結(jié)論運(yùn)行結(jié)論 講明:在程序中,當(dāng)履行賦值操縱p1=&a和p2=&b后,指針指向了變量a與b,這時(shí)引用指針*p1與*p2,便代表了變量a與b.在程
13、序運(yùn)行環(huán)節(jié)中,指針與所指的變量之間的關(guān)系似圖8-3所示:當(dāng)指針被賦值后,其在內(nèi)存的安放似圖8-3a),當(dāng)信息對(duì)比后履行交流,這時(shí),指針變量與所指向的變量的關(guān)系似8-3b)所示. p1 a , *p1 p1 a, *p1a)p2 b, *p2 p2 b, *p2圖圖8-3 程序運(yùn)行中指針與變量之間的程序運(yùn)行中指針與變量之間的&a3&b4&a4&b3b)【例8-3】修改例8-2. * *exam8_3exam8_3* *#include stdio.h #include stdio.h int main(void)int main(void) int int * *
14、p1,p1,* *p2,a,b,p2,a,b,* *t; t; printf(“enter two numbers: ”); printf(“enter two numbers: ”); scanf(%d,%d,&a,&b ) ; scanf(%d,%d,&a,&b ) ; p1=&a; p1=&a; * *p1p1指向整型變量指向整型變量a a* * p2=&b ; p2=&b ; * *p2p2指向整型變量指向整型變量b b* * if( if(* *p1p1* *p2) p2) * *指針交流指向指針交流指向* * t=p1
15、 ; t=p1 ; p1=p2 ; p1=p2 ; p2=t ; p2=t ; printf(%d,%dn,printf(%d,%dn,* *p1,p1,* *p2) ;p2) ;return 0;return 0; 本程序只是使指針交流了指向,當(dāng)指針交流指向后,p1和p2由原來分不指向變量a和b改為分不指向變量b和a,如此一來,*p1便示意變量b,而*p2便示意變量a.enter two numbers: 3 , 4 4 , 3演示運(yùn)行結(jié)論運(yùn)行結(jié)論 u函數(shù)的指標(biāo)能夠是前面所學(xué)過的簡(jiǎn)單信息類型,也能夠是指針類型.使用指針做函數(shù)的指標(biāo),現(xiàn)實(shí)上向函數(shù)傳遞的是變量的地址.u此刻變量的地址在調(diào)用函數(shù)時(shí)
16、做為實(shí)參,被調(diào)用函數(shù)使用指針變量做為形參接收傳遞的地址,因?yàn)楸徽{(diào)函數(shù)中獲得了所傳遞變量的地址,在該地址空間的信息當(dāng)函數(shù)調(diào)用結(jié)束后被物理地保留下來.注重這個(gè)地方實(shí)參的信息類型要與做為形參的指針?biāo)傅膶?duì)象的信息類型要一致. 8.2.3 8.2.3 指針變量做為函數(shù)指標(biāo)指針變量做為函數(shù)指標(biāo) 【例【例8-48-4】操縱指針變量做為函數(shù)的指標(biāo)】操縱指針變量做為函數(shù)的指標(biāo), ,修改例修改例8-2. 8-2. * *exam8_4exam8_4* *#include stdio.h #include stdio.h int main(void)int main(void)void change(int vo
17、id change(int * *pt1,int pt1,int * *pt2); pt2); * *函數(shù)表明函數(shù)表明* * int a,b; int a,b; scanf(%d,%d ,&a,&b ); scanf(%d,%d ,&a,&b ); change(&a,&b); change(&a,&b); * *函數(shù)調(diào)用函數(shù)調(diào)用* * printf(%d,%dn,a,b) ; printf(%d,%dn,a,b) ; return 0; return 0; void change(int void change(int * *p
18、t1,int pt1,int * *pt2)pt2)int t;int t; if ( if (* *pt1pt1* *pt2) pt2) * *交流兩指針?biāo)竷?nèi)容交流兩指針?biāo)竷?nèi)容* * t= t=* *pt1; pt1; * *pt1=pt1=* *pt2; pt2; * *pt2=t; pt2=t; 演示如果將程序中的change函數(shù)作似下修改,能否達(dá)到一樣的結(jié)果?為啥?void change(int *pt1, int *pt2 ) int *t; if (*pt1*pt2 t=pt1;pt1=pt2; pt2=t ; 講明:主函數(shù)在調(diào)用change函數(shù)時(shí),實(shí)參是變量a、b地址,形參是
19、指針變量,實(shí)介入形參之間“值傳遞”,將變量a、b的地址分不傳給形參pt1和pt2,change函數(shù)對(duì)pt1和pt2所指內(nèi)存中存放的信息履行對(duì)比同時(shí)依照情況履行交流,因?yàn)閜t1和pt2分不指向主函數(shù)中的a和b,所以在change函數(shù)內(nèi)履行的交流操縱結(jié)論被帶回到主函數(shù)中的a和b.形參指針變量pt1 (指向變量a)和pt2 (指向變量b),在函數(shù)調(diào)用最先時(shí)才安排存儲(chǔ)空間,函數(shù)調(diào)用結(jié)束后站即被釋放.固然被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但能夠改變它們所指向的變量的值.歸納:為了操縱被調(diào)用函數(shù)改變的變量值,除了能夠通過函數(shù)名返回一個(gè)值外,還能夠使用指針(或指針變量)作函數(shù)實(shí)參來實(shí)現(xiàn)返回多于1個(gè)的值.其
20、機(jī)制為:在履行被調(diào)用函數(shù)時(shí),使形參指針變量所指向的變量的值產(chǎn)生改變;函數(shù)調(diào)用結(jié)束后,通過不變的實(shí)參指針(或?qū)崊⒅羔樧兞浚⒏淖兊闹当A粝聛?Return8.3 數(shù)組指針 8.3.1 8.3.1 指向數(shù)組元素的指針指向數(shù)組元素的指針 在在C C語言中語言中, ,數(shù)組是一組類型一樣同時(shí)存儲(chǔ)在接連數(shù)組是一組類型一樣同時(shí)存儲(chǔ)在接連內(nèi)存空間的變量?jī)?nèi)存空間的變量. .所以當(dāng)指針指向數(shù)組中的某一個(gè)元所以當(dāng)指針指向數(shù)組中的某一個(gè)元素時(shí)素時(shí), ,我們便能夠通過指針會(huì)見其前后的全部元素我們便能夠通過指針會(huì)見其前后的全部元素. .定義一個(gè)指向數(shù)組元素的指針變量方式定義一個(gè)指向數(shù)組元素的指針變量方式, ,與前面講解與
21、前面講解的指向變量的指針變量一樣的指向變量的指針變量一樣. .例似例似: :double z3=0.0 , 1.0 , 2.0double z3=0.0 , 1.0 , 2.0double double * *wp, wp, * *zp=z ;zp=z ;wp=&z2;wp=&z2; 指針變量能夠指向數(shù)組或數(shù)組元素,對(duì)數(shù)組而言,數(shù)組和數(shù)組元素的引用,也同樣能夠使用指針變量. 用數(shù)組名給指針變量賦值令指針指向數(shù)組的起始位置,能夠如此寫:wp=&z0;或省略下標(biāo)和&符號(hào)寫成:zp=z; 往往使用后一種形式,這是因?yàn)樵贑語言中,數(shù)組名被看做是指向第一個(gè)數(shù)組元素的指針.
22、同樣地,也有兩種方式將指針指向數(shù)組的第2個(gè)元素,使用 zp=&z2 或 zp=z+2 來實(shí)現(xiàn). 1. 1. 數(shù)組名和地址關(guān)系數(shù)組名和地址關(guān)系 數(shù)組名在數(shù)組名在C C語言中被操作成一個(gè)地址常量語言中被操作成一個(gè)地址常量, ,也也便是數(shù)組所占接連存儲(chǔ)單元的起始地址便是數(shù)組所占接連存儲(chǔ)單元的起始地址, ,能夠用能夠用在數(shù)組名后加一個(gè)整數(shù)的方式在數(shù)組名后加一個(gè)整數(shù)的方式, ,依次表達(dá)數(shù)組中依次表達(dá)數(shù)組中差別元素的地址差別元素的地址. .似似: :int a10;int a10;a a與與&a0&a0是等價(jià)的是等價(jià)的,a1,a1的地址是的地址是a+1,a+1,可用可用&a
23、1&a1示意示意, ,對(duì)數(shù)組元素對(duì)數(shù)組元素a3,a3,能夠用能夠用* *(a+3)(a+3)來引來引用用, ,也能夠用也能夠用* *&a3&a3來引用來引用. .8.3.2 通過指針引用數(shù)組元素通過指針引用數(shù)組元素 *exam8_5*#include stdio.h int main(void) int i,a=1,2,3,4,5; for (i=0;i5;i+) printf(%d ,*(a+i); return 0;【例【例8-58-5】通過數(shù)組首地址引用數(shù)組元素】通過數(shù)組首地址引用數(shù)組元素, ,輸出數(shù)組中輸出數(shù)組中全部元素全部元素. . 本例中通過a+i,依次指向
24、了a數(shù)組的每一個(gè)元素;使用*(a+i)引用每一個(gè)元素的值.演示2. 2. 通過指針引用一維數(shù)組元素通過指針引用一維數(shù)組元素 如果有似下定義:int a10 , *p=a;來看一下指面向數(shù)組的示意方式:(1)p+i與a+i示意數(shù)組元素ai的地址,即&ai.對(duì)整個(gè)a數(shù)組來講,共有10個(gè)元素,i為09,那么數(shù)組元素的地址便能夠示意為p+0p+9或a+0a+9,與&a0&a9是一致的.(2)因?yàn)閜+i與a+i都示意數(shù)組第i個(gè)元素的地址,所以*(p+i)和*(a+i)便等效于ai. 通過指針引用一維數(shù)組元素需要一個(gè)指向數(shù)組元素的指針變量,它的基類型與數(shù)組元素的類型一樣,通過指針引
25、用數(shù)組元素是C語言提供的一種高效數(shù)組會(huì)見機(jī)制.指向數(shù)組的指針變量也能夠帶下標(biāo),似pi,其結(jié)果相當(dāng)于*(p+i). 依照以上敘述,引用一個(gè)數(shù)組元素,能夠用傳統(tǒng)的下標(biāo)法,似ai形式;也能夠用指針法,似*(p+i )和*(a+i).其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a. 注重注重:p+1:p+1指向數(shù)組的下一個(gè)元素指向數(shù)組的下一個(gè)元素, ,而不是而不是簡(jiǎn)單地使指針變量簡(jiǎn)單地使指針變量p p的值的值+1.+1.事實(shí)上際改變事實(shí)上際改變?yōu)闉閜+1p+1* *size(sizesize(size為一個(gè)元素占用的字節(jié)為一個(gè)元素占用的字節(jié)數(shù))數(shù))【例【例8-68-6】采納指針變量示意的地址法輸
26、入輸出數(shù)組】采納指針變量示意的地址法輸入輸出數(shù)組各元素各元素. . * *exam8_6exam8_6* *#include stdio.h #include stdio.h int main(void)int main(void) int n,a10,int n,a10,* *ptr=a; ptr=a; * *定義時(shí)對(duì)指針變量初始化定義時(shí)對(duì)指針變量初始化* *for(n=0;n=9;n+)for(n=0;n=9;n+)scanf(%d,ptr+n);scanf(%d,ptr+n);for(n=0;n=9;n+)for(n=0;n=9;n+)printf ( %4d , printf ( %4
27、d , * *(ptr+n) ;(ptr+n) ;printf (n) ;printf (n) ;return 0;return 0; 演示【例【例8-78-7】操縱指針法輸入輸出數(shù)組各元素】操縱指針法輸入輸出數(shù)組各元素. . * *exam8_7exam8_7* *#include stdio.h#include stdio.hint main(void)int main(void) int n,a10,int n,a10,* *ptr=a;ptr=a;for (n=0;n=9;n+)for (n=0;n=9;n+)scanf (%d,ptr+) ;scanf (%d,ptr+) ;ptr=
28、a ; ptr=a ; * *指針變量再一次指向數(shù)組首址指針變量再一次指向數(shù)組首址* *for (n=0; n=9 ;n+ )for (n=0; n=9 ;n+ )printf(%4d, printf(%4d, * *ptr+ ) ;ptr+ ) ;printf(n) ;printf(n) ;return 0;return 0; 注重:*ptr示意指針?biāo)赶虻淖兞浚?ptr+示意指針?biāo)赶虻淖兞康刂芳?個(gè)變量所占字節(jié)數(shù),即指針指向下一個(gè)元素,而printf( %4d , *ptr+) 中,*ptr+所起作用為先輸出指針指向的變量的值,接著指針變量加1. 演示8.3.3 數(shù)組名作函數(shù)指標(biāo)數(shù)組名作
29、函數(shù)指標(biāo) 在講解了使用指針操作數(shù)組后,我們?cè)賮頃?huì)商數(shù)組作函數(shù)指標(biāo),這時(shí)有四種情況.(1)形參、實(shí)參均用數(shù)組名.這在第七章中已作會(huì)商.(2)形參用指針,實(shí)參用數(shù)組名.(3)形參用數(shù)組,實(shí)參用指針.(4)形參用指針,實(shí)參用指針. 這四種方式本色根基上地址值的傳遞,都實(shí)現(xiàn)數(shù)組的引用傳遞. 【例【例8-88-8】求】求n n個(gè)整數(shù)的最大值、最小值個(gè)整數(shù)的最大值、最小值. . 求n個(gè)數(shù)的最大值的一樣方式我們已非常熟悉,在這個(gè)地方關(guān)鍵考查引入指針操作數(shù)組后,數(shù)組作函數(shù)指標(biāo)的應(yīng)用. 【思路導(dǎo)航】假定不超過【思路導(dǎo)航】假定不超過100100個(gè)數(shù)個(gè)數(shù), ,信息輸入輸出在主函數(shù)中完信息輸入輸出在主函數(shù)中完成成,
30、,求最大值、最小值用一個(gè)函數(shù)完成求最大值、最小值用一個(gè)函數(shù)完成, ,該函數(shù)形參用數(shù)組傳遞該函數(shù)形參用數(shù)組傳遞n n個(gè)數(shù)個(gè)數(shù), ,實(shí)參用指針實(shí)參用指針, ,最大值、最小值使用全局變量最大值、最小值使用全局變量. .程序似下程序似下: : * *exam8_8exam8_8* *#include stdio.h #include stdio.h #define L 100#define L 100int max,min; int max,min; * *定義全局變量定義全局變量* *int main(void)int main(void) int aL, int aL,* *p ;p ; int
31、n, i; int n, i; void max_min(); void max_min(); * *函數(shù)表明函數(shù)表明* * printf(n= ); printf(n= ); scanf(%d,&n); scanf(%d,&n); printf(enter %d numbers: ,n); printf(enter %d numbers: ,n); for(i=0;in;i+) for(i=0;in;i+) scanf(%d,&ai); scanf(%d,&ai); p=a; max_min(p,n); *調(diào)用函數(shù)* printf(max=%4d,min=%4
32、dn,max,min); return 0; void max_min(int b,int x) *求最大值、最小值函數(shù)* int i; max=min=b0; *最大值、最小值初始化為第一個(gè)信息* for(i=1;imax) max=bi; if(bimin) min=bi; 演示8.3.4 8.3.4 指向二維數(shù)組的指針和指針變量指向二維數(shù)組的指針和指針變量 1. 1. 二維數(shù)組的指針二維數(shù)組的指針 對(duì)二維數(shù)組,相當(dāng)于一張二維表格,存儲(chǔ)按行按列存放.例似,對(duì)二維數(shù)組a45,相當(dāng)于下面的二維信息表: 第第0 0列第列第1 1列第列第2 2列第列第3 3列第列第4 4列列第第0 0行行:a00
33、 a01 a02 a03 a04 :a00 a01 a02 a03 a04 第第1 1行行:a10 a11 a12 a13 a14 :a10 a11 a12 a13 a14 第第2 2行行:a20 a21 a22 a23 a24 :a20 a21 a22 a23 a24 第第3 3行行:a30 a31 a32 a33 a34:a30 a31 a32 a33 a34分不相當(dāng)于一維數(shù)組:a0a0a1a1a2a2a3a3 二維數(shù)組具有首地址、行地址、元素地址等相關(guān)指針.數(shù)組名代表首地址,稱為二維數(shù)組的指針;行地址是二維數(shù)組中一行的首地址,二維數(shù)組中的一行相當(dāng)于一個(gè)一維數(shù)組;元素地址是二維數(shù)組的具體重
34、量地址. aa+1a+2a+3a0 a0+1 a0+2 a0+3 a0+4a30 a31 a32 a33 a34a20 a21 a22 a23 a24a10 a11 a12 a13 a14a00 a01 a02 a03 a04圖8-7講明:(1)從二維數(shù)組的角度看,a代表整個(gè)二維數(shù)組的首地址,也便是第0行的首地址.a+1代表第1行的首地址,a+2代表第2行的首地址,a+3代表第3行的首地址,似圖87. (2)a0、a1、a2、a3既然是一維數(shù)組名,而C語言又規(guī)定了數(shù)組名代表首地址,所以a0代表第0行一維數(shù)組中第0列元素的地址,即&a00,同樣a1的值是&a10,a2的值是&am
35、p;a20,a3的值是&a30.基于一維數(shù)組的操作方式,第0行第1列的地址可示意為a0+1, 第0行第2列的地址可示意為a0+2,第0行第3列的地址可示意為a0+3,第0行第4列的地址可示意為a0+4,似圖8-7所示.第i行第j列的地址可示意為ai+j. (3)同時(shí)基于一維數(shù)組的操作有:a0和*(a+0)等價(jià),a1和*(a+1)等價(jià),a2和*(a+2)等價(jià),a3和*(a+3)等價(jià).所以第i行第j列地址也能夠示意為*(a+i)+j,毫無疑咨詢&aij是我們?cè)绫忝靼椎腶ij的地址. (4)基于上面的對(duì)比,引入指針后,二維數(shù)組的重量aij可示意成: aij、*(*(a+i)+j)、*
36、(ai+j)、*(a0+i*m+j),其中m是數(shù)組一行的元素個(gè)數(shù). 【例【例8-98-9】輸出一指定數(shù)組】輸出一指定數(shù)組. . * *exam8_9exam8_9* *#include stdio.h#include stdio.hint main(void)int main(void) int a45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, int a45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20;16,17,18,19,20;int i,j;int i,j;for(i=0;i4;i+)for(i
37、=0;i4;i+) for(j=0;j5;j+) for(j=0;j5;j+) printf(%6d, printf(%6d,* *(a0+i(a0+i* *5+j);5+j); * *或或printf(%6d,printf(%6d,* *( (* *(a+i)+j); (a+i)+j); * * printf(n); printf(n); return 0; return 0; 演示2. 指向二維數(shù)組元素的指針變量指向二維數(shù)組元素的指針變量 操縱指向二維數(shù)組元素的指針變量,能夠完成二維數(shù)組信息的操縱操作.(1)定義與二維數(shù)組一樣基類型的指針變量.(2)在指針變量與要操作的數(shù)組(元素)之間創(chuàng)站
38、關(guān)聯(lián).(3)使用指針?biāo)赶虻淖兞縼硗瓿蓴?shù)組元素的操縱操作. 【例【例8-108-10】用指針法操作例】用指針法操作例8-9. 8-9. * *exam8_10exam8_10* *#include stdio.h#include stdio.hint main(void)int main(void) int a45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, int a45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16, 17,18,19,20;16, 17,18,19,20; int int * *p;p; for(p=a0;p
39、a0+20;p+) for(p=a0;pa0+20;p+) if(p-a0)%5=0)printf(n); if(p-a0)%5=0)printf(n);* *每行輸出每行輸出5 5個(gè)元素個(gè)元素* * printf(%6d, printf(%6d,* *p);p); return 0; return 0; 演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 運(yùn)行結(jié)論:3指向整個(gè)一維數(shù)組的指針變量指向整個(gè)一維數(shù)組的指針變量 一個(gè)二維數(shù)組相當(dāng)于多個(gè)一維數(shù)組.通過指向整個(gè)一維數(shù)組的指針變量,也能夠完成二維數(shù)組信息的操縱操作,這也是操作二維數(shù)組的
40、指針法.我們舉例來講明指向整個(gè)一維數(shù)組的指針變量的定義,例似:int (*p)5;定義了一個(gè)指向具有5個(gè)元素的一維數(shù)組的指針變量p,p的增值以指向的一維數(shù)組為單位,一維數(shù)組的5個(gè)元素可用(*p)0、 (*p)1、 (*p)2、 (*p)3、 (*p)4示意.a是上面定義的數(shù)組,似果p=a,那么p+i指向a數(shù)組的第i行,*(p+i)+j指向a數(shù)組的第i行第j列元素. 【例【例8-118-11】輸出二維數(shù)組中某行某列元素的值】輸出二維數(shù)組中某行某列元素的值. . *exam8_11*#include stdio.hint main(void) int a45=1,2,3,4,5,6,7,8,9,1
41、0,11,12,13,14,15,16, 17,18,19,20; int (*p)5,i,j; p=a; scanf(%d%d,&i,&j); printf(a%d%d=%d,i,j,*(*(p+i)+j); return 0; 演示3 4 a34=20 運(yùn)行情況: 引入指針操作二維數(shù)組后,對(duì)使用二維數(shù)組作函數(shù)指標(biāo)的操作與一維數(shù)組類似. 【例【例8-128-12】有一個(gè)班】有一個(gè)班,3,3個(gè)學(xué)生個(gè)學(xué)生, ,各學(xué)各學(xué)4 4門課門課, ,統(tǒng)計(jì)總平均分?jǐn)?shù)統(tǒng)計(jì)總平均分?jǐn)?shù), ,以及以及第第n n個(gè)學(xué)生的成績(jī)個(gè)學(xué)生的成績(jī). . 【思路導(dǎo)航】使用二維數(shù)組指針作函數(shù)指標(biāo)【思路導(dǎo)航】使用二維數(shù)
42、組指針作函數(shù)指標(biāo), ,用函數(shù)用函數(shù)averageaverage()()求總平均成績(jī)求總平均成績(jī), ,用函數(shù)用函數(shù)searchsearch()尋出同時(shí)輸出第()尋出同時(shí)輸出第i i個(gè)學(xué)生的成績(jī)個(gè)學(xué)生的成績(jī). . 程序似下:* *exam8_12exam8_12* *#include stdio.h#include stdio.h int main(void) int main(void) void average(float void average(float * *p,int n);p,int n); void search(float( void search(float(* *p)4,i
43、nt n);p)4,int n); float score34=65,67,70,60,80,87,90,81, float score34=65,67,70,60,80,87,90,81,90,99,100,98;90,99,100,98; average( average(* *score,12); score,12); * *求求1212個(gè)分?jǐn)?shù)的平均分個(gè)分?jǐn)?shù)的平均分* * search(score,2); search(score,2); * *求第求第2 2個(gè)學(xué)生成績(jī)個(gè)學(xué)生成績(jī)* * return 0; return 0; void average(float void average
44、(float * *p,int n)p,int n) float float * *p_end;p_end; float sum=0,aver; float sum=0,aver; p_end=p+n-1; p_end=p+n-1; for(;pp_end;p+) for(;pp_end;p+) sum=sum+( sum=sum+(* *p);p); aver=sumn; aver=sumn; printf(average=%5.2fn,aver); printf(average=%5.2fn,aver); void search(float(void search(float(* *p)4
45、,int n)p)4,int n) int i; int i; printf(NO.%d students score:n,n); printf(NO.%d students score:n,n); for(i=0;i4;i+) for(i=0;i=v)?u:v; return(z); 演示5.6,4.8 a= 5.6 b= 4.8 max= 5.6 運(yùn)行情況:想一想:如果將上面程序中的float (*p)(float,float) 換成 float (*p)(),能獵取精確結(jié)論嗎?上機(jī)試一試. 8.5.3 8.5.3 用指向函數(shù)的指針作函數(shù)指標(biāo)用指向函數(shù)的指針作函數(shù)指標(biāo) 指向函數(shù)的指針變量的
46、關(guān)鍵用途是把函數(shù)指針作函數(shù)指標(biāo),以實(shí)現(xiàn)“函數(shù)”作函數(shù)的指標(biāo),便于編制通用程序.此刻形參用指向函數(shù)的指針變量,而實(shí)參是現(xiàn)實(shí)函數(shù)的入口地址(函數(shù)名),毫無疑咨詢實(shí)參也能夠是指向現(xiàn)實(shí)函數(shù)的指針變量. 【例【例8-178-17】編制程序】編制程序, ,調(diào)用一個(gè)多功能函數(shù)調(diào)用一個(gè)多功能函數(shù), ,如果傳入的指標(biāo)為如果傳入的指標(biāo)為最大值函數(shù)最大值函數(shù), ,那么求兩個(gè)數(shù)的最大值;如果傳入的指標(biāo)是最小那么求兩個(gè)數(shù)的最大值;如果傳入的指標(biāo)是最小值函數(shù)值函數(shù), ,那么求兩個(gè)數(shù)的最小值那么求兩個(gè)數(shù)的最小值. . * *exam8_17exam8_17* *#include stdio.h#include stdio.
47、hfloat max(float x,float y) float max(float x,float y) * *求兩個(gè)數(shù)最大值的函數(shù)求兩個(gè)數(shù)最大值的函數(shù)* * float z; float z; z=(x=y)?x:y; z=(x=y)?x:y; return(z); return(z); (續(xù))(續(xù)) float min(float x,float y) *求兩個(gè)數(shù)最小值的函數(shù)* float z; z=(x=y)?x:y; return(z); void fun(float x,float y,float (*p)(float,float)*多功能函數(shù)* float result; re
48、sult=(*p)(x,y); *通過指針調(diào)用函數(shù)* printf(%5.1fn,result); int main(void) float max(float,float); float min(float,float);void fun(float x,float y,float (*p)(float,float);*函數(shù)表明*(續(xù))float a,b;printf(input a,b:); scanf(%f,%f,&a,&b); printf(Max); fun(a,b,max); *函數(shù)名max作實(shí)參傳遞給fun函數(shù)中的指針變量p* printf(Min); fun(a
49、,b,min); *函數(shù)名min作實(shí)參傳遞給fun函數(shù)中的指針變量p* return 0; 演示input a,b:5.6,4.8 Max5.6 Min 4.8 運(yùn)行情況:講明講明: :第一次調(diào)用第一次調(diào)用funfun()函數(shù)時(shí)()函數(shù)時(shí), ,除了將除了將a a、b b的值傳遞給的值傳遞給x x、y,y,還將函數(shù)還將函數(shù)maxmax的入口地址傳遞給指向函數(shù)的指針的入口地址傳遞給指向函數(shù)的指針變量變量p,p,這時(shí)函數(shù)這時(shí)函數(shù)fun()fun()中的中的( (* *p)(x,y)p)(x,y)相當(dāng)于相當(dāng)于max(x,y).max(x,y).第二次調(diào)用第二次調(diào)用funfun()函數(shù)時(shí)()函數(shù)時(shí),a,
50、a、b b的值同樣傳遞給的值同樣傳遞給x x、y,y,另改用函數(shù)另改用函數(shù)minmin的入口地址傳遞給指向函數(shù)的指針的入口地址傳遞給指向函數(shù)的指針變量變量p,p,這時(shí)函數(shù)這時(shí)函數(shù)fun()fun()中的中的( (* *p)(x,y)p)(x,y)相當(dāng)于相當(dāng)于min(x,y).min(x,y). 本例如此做無太多現(xiàn)實(shí)意義本例如此做無太多現(xiàn)實(shí)意義, ,關(guān)鍵使讀者認(rèn)識(shí)指向關(guān)鍵使讀者認(rèn)識(shí)指向函數(shù)的指針變量作函數(shù)指標(biāo)的做法函數(shù)的指針變量作函數(shù)指標(biāo)的做法. .能夠看到能夠看到, ,不論調(diào)不論調(diào)用用maxmax函數(shù)仍是函數(shù)仍是minmin函數(shù)函數(shù), ,函數(shù)函數(shù)funfun一點(diǎn)都沒有改動(dòng)一點(diǎn)都沒有改動(dòng), ,只
51、只是在調(diào)用是在調(diào)用funfun函數(shù)時(shí)將實(shí)參函數(shù)名改變而已函數(shù)時(shí)將實(shí)參函數(shù)名改變而已. .這便增加這便增加了函數(shù)使用的靈活性了函數(shù)使用的靈活性, ,常操縱這一點(diǎn)來編寫通用函數(shù)常操縱這一點(diǎn)來編寫通用函數(shù)實(shí)現(xiàn)多種專用功能實(shí)現(xiàn)多種專用功能. . Return8.6 返回指針值的函數(shù) 函數(shù)的返回值能夠是整型、實(shí)型、字符型等,也能夠是指針類型,這時(shí)的函數(shù)稱為指針函數(shù).與往常使用的函數(shù)對(duì)比,差別的僅是函數(shù)的返回值類型為指針類型.這種帶回指針值的函數(shù),一樣定義形式為:類型講明符*函數(shù)名(形參表)函數(shù)體 【例【例8-188-18】設(shè)有如果干學(xué)生】設(shè)有如果干學(xué)生, ,每個(gè)學(xué)生有每個(gè)學(xué)生有6 6門課程成績(jī)門課程成績(jī)
52、. .輸入學(xué)生學(xué)輸入學(xué)生學(xué)號(hào)號(hào), ,查尋同時(shí)輸出其全部成績(jī)查尋同時(shí)輸出其全部成績(jī), ,用指針函數(shù)實(shí)現(xiàn)用指針函數(shù)實(shí)現(xiàn). . * *exam8_18exam8_18* *#include stdio.h#include stdio.hfloat float * *search(float (search(float (* *p)6,int n)p)6,int n) float float * *t; t=t; t=* *(p+n);(p+n); return(t); return(t); int main(void)int main(void) float float * *search(floa
53、t (search(float (* *p)6,int n);p)6,int n); float score6=70,85,78,80,90,90, float score6=70,85,78,80,90,90, 90,79,63,70,56,68,49,60,56,50,70,60;90,79,63,70,56,68,49,60,56,50,70,60; int m,i ; float int m,i ; float * *k;k; printf(enter student NO.(02):); printf(enter student NO.(02):); scanf(%d,&m)
54、; scanf(%d,&m); k=search(score,m); k=search(score,m); printf(NO.%d students scores:n,m); printf(NO.%d students scores:n,m); for(i=0;i6;i+) for(i=0;i6;i+) printf(%5.1ft, printf(%5.1ft,* *(k+i);(k+i); return 0; return 0; 演示想一想:似果將“t=*(p+n);”,改為“t=(*p+n);”運(yùn)行結(jié)論似何?為啥?講明:函數(shù)search的形參p是指向見諒6個(gè)元素的一維數(shù)組的指針變
55、量.p+n指向score數(shù)組第n行,*(p+n)是第n行第0列的元素.函數(shù)search返回第n個(gè)學(xué)生的成績(jī)最先地址.主函數(shù)中的*(k+i)示意第k個(gè)學(xué)生第i名課的成績(jī). Return8.7 指針數(shù)組和指向指針的指針 除了能夠定義變量的指針、數(shù)組的指針、字符串的指針、函數(shù)的指針等指針類型和指針變量外,還能夠讓指針做為其它組織類型的基類型,形成指針數(shù)組、多級(jí)指針,以廣泛地應(yīng)用指針. 8.7.1 8.7.1 指針數(shù)組指針數(shù)組 如果數(shù)組每個(gè)元素的類型為指針類型,那么稱此數(shù)組為指針數(shù)組.也便是講,指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量.指針數(shù)組的一樣定義形式:類型講明符*數(shù)組名數(shù)組長(zhǎng)度例似: int
56、 *p4; 注重不要寫成int (*p)4 在指針數(shù)組的定義中 “”的優(yōu)先級(jí)比“*”的優(yōu)先級(jí)高 .p先與4聯(lián)合,形成p4,這明顯是數(shù)組形式,接著再與“*”聯(lián)合,形成指針數(shù)組. 【例【例8-198-19】將部分書名按字母次序輸出】將部分書名按字母次序輸出. . * *exam8_19exam8_19* *#include string.h#include string.h#include stdio.h#include stdio.hint main(void)int main(void) char char * *name5=pascal,Clanguage,basic, name5=pasc
57、al,Clanguage,basic, windows98,office97;windows98,office97; void sort(); void sort(); * *函數(shù)表明函數(shù)表明* * void output(); void output(); * *函數(shù)表明函數(shù)表明* * sort(name,5); sort(name,5); output(name,5); output(name,5); ( (續(xù)續(xù)) ) void sort(char void sort(char * *sname,int n) sname,int n) * *排序函數(shù)排序函數(shù)* * char char *
58、*temp;temp; int i,j,k; int i,j,k; for(i=0;in-1;i+) for(i=0;in-1;i+) * *挑選排序法挑選排序法* * k=i; k=i; for(j=i+1;jn;j+) for(j=i+1;j0 )k=j; if(strcmp(snamek,snamej)0 )k=j; if(k!=i) if(k!=i) temp=snamei;snamei=snamek;snamek=temp; temp=snamei;snamei=snamek;snamek=temp; void output(char void output(char * *onam
59、e,int n) oname,int n) * *輸出函數(shù)輸出函數(shù)* * int i; int i; for(i=0;in;i+) for(i=0;in;i+)printf(%sn,onamei);printf(%sn,onamei); 演示8.7.2 8.7.2 指向指針的指針指向指針的指針 我們把指向指針信息的指針變量,簡(jiǎn)稱為指向指針的指針或多級(jí)指針.指向指針的指針變量的定義形式:類型講明符* *變量名相當(dāng)于:(類型講明符*) *變量名 例似:char *name5;char *p=name; 指針數(shù)組namename0name1name2name3name4pascalClanguage
60、basicwindows98office97p圖8-11【例【例8-208-20】使用指向指針的指針】使用指向指針的指針. . * *exam8_20exam8_20* *#include stdio.h#include stdio.hint main(void)int main(void) char char * *name5=pascal,Clanguage,basic, name5=pascal,Clanguage,basic, windows98, office97;windows98, office97; char char * * *p;p; int i; int i; p=name; p=name; for(i=0;i5;i+) for(i=0;i1) while (argc1) p+; p+; printf(%s , printf(%s ,* *p);p); argc-; argc-; return 0; return 0; 演示ECHOComputer college Computer college 運(yùn)行情況:事實(shí)上main()函數(shù)中的形參不必然命名為argc和argv,能夠是隨意率性的名字,只是人們風(fēng)俗用argc和argv而已.Return8.8 指針應(yīng)用舉例 指針是C語言學(xué)習(xí)的一大難點(diǎn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年婚禮化妝造型合同
- 2024大數(shù)據(jù)中心存儲(chǔ)設(shè)備采購(gòu)合同
- 2024年度分包合作協(xié)議書
- 中考狀語課件教學(xué)課件
- 2024年度版權(quán)返租及授權(quán)使用協(xié)議
- 2024年國(guó)際皮毛市場(chǎng)交易合同
- 鄉(xiāng)鎮(zhèn)防汛抗旱救災(zāi)的應(yīng)急預(yù)案(5篇)
- (2024版)灑水車團(tuán)隊(duì)租賃合同(2024版)
- 2024年度軟件許可及技術(shù)支持服務(wù)合同
- 2024年度互聯(lián)網(wǎng)金融服務(wù)平臺(tái)合作協(xié)議
- 高中物理學(xué)考試卷
- 牙體牙髓病學(xué)牙髓疾病講義
- 標(biāo)準(zhǔn)時(shí)間設(shè)定焊裝
- 年產(chǎn)10萬噸電解銅的銅電解車間設(shè)計(jì)
- 三字經(jīng)全文帶拼音完整版打印版86222
- 自由基溶液聚合工藝——丙烯腈的溶液聚合
- 附件1-江西省病原微生物實(shí)驗(yàn)室備案登記表.doc-附件1
- 柴油發(fā)電機(jī)組技術(shù)規(guī)范書
- 陶瓷工藝學(xué)4陶瓷成型
- D702-1~3 常用低壓配電設(shè)備及燈具安裝(2004年合訂本)_(高清版)
- 山西經(jīng)濟(jì)出版社小學(xué)信息技術(shù)第一冊(cè)全冊(cè)教案
評(píng)論
0/150
提交評(píng)論