版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序設(shè)計(jì)基礎(chǔ) - C語(yǔ)言第7章 指針第1頁(yè),共38頁(yè)。項(xiàng)目引導(dǎo)高校學(xué)生成績(jī)管理系統(tǒng)項(xiàng)目中,學(xué)生的成績(jī)信息可以通過數(shù)組來存儲(chǔ)。也同時(shí)通過把數(shù)組定義成全局變量,實(shí)現(xiàn)了共享。方便我們通過模塊化程序設(shè)計(jì)實(shí)現(xiàn)了該項(xiàng)目中各個(gè)子功能的實(shí)現(xiàn)。但是數(shù)組存儲(chǔ)數(shù)據(jù),要求創(chuàng)建時(shí)就要制定數(shù)組的大小。當(dāng)數(shù)據(jù)量遠(yuǎn)少于數(shù)組長(zhǎng)度時(shí),就造成了內(nèi)存空間的浪費(fèi);若數(shù)據(jù)量大于數(shù)組長(zhǎng)度時(shí),多的數(shù)據(jù)也無(wú)法存儲(chǔ)。而且訪問數(shù)組的大量數(shù)據(jù),速度低于通過內(nèi)存地址訪問速度。使用指針來處理數(shù)據(jù)呢,可以提高程序的編譯效率和執(zhí)行速度。通過指針可使用主調(diào)函數(shù)和被調(diào)函數(shù)之間共享變量或數(shù)據(jù)結(jié)構(gòu),便于實(shí)現(xiàn)雙向數(shù)據(jù)通訊。同時(shí)指針可以實(shí)現(xiàn)動(dòng)態(tài)的存儲(chǔ)分配,而且便于表示
2、各種數(shù)據(jù)結(jié)構(gòu),編寫高質(zhì)量的程序。這章將詳細(xì)介紹指針的使用,通過指針來完成項(xiàng)目程序設(shè)計(jì)。第2頁(yè),共38頁(yè)。第7章 指針 本章重點(diǎn) 本章難點(diǎn)掌握指針變量的定義和使用方法能合理利用指針變量編制功能函數(shù),解決簡(jiǎn)單的實(shí)際問題理解指針變量與一維數(shù)組的關(guān)系,能熟練運(yùn)用指向一維數(shù)組的指針變量操縱數(shù)組元素能正確利用字符串指針處理字符串的相關(guān)問題 指向二維數(shù)組指針的使用,以及使用指針解決實(shí)際問題第3頁(yè),共38頁(yè)。 本章主要介紹C語(yǔ)言指針的概念,指針變量的定義、初始化和使用,重點(diǎn)講解指向一維數(shù)組的指針變量和指向字符串的指針變量的用法,為后續(xù)學(xué)習(xí)結(jié)構(gòu)體與共用體的知識(shí)奠定基礎(chǔ)。第7章 指針7.1 指針的概念7.2 指向
3、變量的指針變量7.3 指向一維數(shù)組的指針變量7.4 指向字符串的指針變量7.5 高校學(xué)生成績(jī)管理系統(tǒng)-用指針實(shí)現(xiàn)模塊設(shè)計(jì)第4頁(yè),共38頁(yè)。7.1 指針的概念7.1.1 變量存儲(chǔ)的相關(guān)概念1內(nèi)存地址 計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中擁有大量的存儲(chǔ)單元,一般把存儲(chǔ)器中的一個(gè)字節(jié)稱為一個(gè)內(nèi)存單元,不同的數(shù)據(jù)類型的變量所占用的內(nèi)存單元數(shù)不等,在第2章中已有詳細(xì)的介紹。為了正確地訪問這些內(nèi)存單元,必須為每個(gè)內(nèi)存單元編上號(hào)。根據(jù)內(nèi)存單元的編號(hào)即可準(zhǔn)確地找到該內(nèi)存單元。內(nèi)存單元的編號(hào)也叫做“內(nèi)存地址”。 提醒:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。如同宿舍房間號(hào)(地址)與住在其中的人(數(shù)據(jù))一樣,
4、是完全不同的兩回事。第5頁(yè),共38頁(yè)。7.1 指針的概念7.1.1 變量存儲(chǔ)的相關(guān)概念2變量名、變量地址和變量值(1)“變量名”是給內(nèi)存空間取的一個(gè)容易記憶的名稱,如同上網(wǎng)時(shí)的網(wǎng)址域名一樣,可方便用戶使用(實(shí)際上起作用的是IP地址);(2)“變量地址”是系統(tǒng)分配給變量的內(nèi)存單元的起始地址;(3)“變量值”是變量的地址所對(duì)應(yīng)的內(nèi)存單元中所存放的數(shù)值或內(nèi)容。第6頁(yè),共38頁(yè)。7.1 指針的概念7.1.2 變量的訪問方式系統(tǒng)對(duì)變量的訪問形式可分為直接訪問和間接訪問。1直接訪問 要訪問變量必須通過地址找到該變量的存儲(chǔ)單元。由于通過地址可以找到變量單元,因此可以說一個(gè)地址“指向”一個(gè)變量存儲(chǔ)單元。例如,
5、地址2000指向變量a,2002指向變量b等。這種通過變量名或地址訪問一個(gè)變量的方式稱為“直接訪問”。用變量名對(duì)變量的訪問也屬于“直接訪問”,因?yàn)樵诰幾g后,變量名和變量地址之間建立了對(duì)應(yīng)關(guān)系,對(duì)變量名的訪問,系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)換成利用地址對(duì)變量的訪問。提醒:第7頁(yè),共38頁(yè)。7.1 指針的概念7.1.2 變量的訪問方式2間接訪問 “間接訪問”方式就是把一個(gè)變量的地址放在另一個(gè)變量中,利用這個(gè)“特殊”的變量進(jìn)行訪問。如圖7-2所示,“特殊”變量p存放的內(nèi)容是變量d的地址,利用變量p來訪問變量d的方法稱為“間接訪問”。 存放地址的變量是一種特殊的變量,它只能用來存放地址,而不能用來存放其他類型(如整型、
6、實(shí)型、字符型)的數(shù)據(jù),需要專門加以定義。提醒:第8頁(yè),共38頁(yè)。7.1 指針的概念7.1.2 變量的訪問方式系統(tǒng)對(duì)變量的訪問形式可分為直接訪問和間接訪問。3兩種訪問方式的比較 為了讓讀者容易理解兩種訪問方式的實(shí)質(zhì)和其不同,不妨再打個(gè)比喻。假設(shè)為了開一個(gè)A抽屜,有兩種辦法:一種是將A鑰匙帶在身上,需要時(shí)直接找出該A鑰匙打開抽屜,取出所需的東西,這相當(dāng)于直接訪問;另一種辦法是為安全起見,將該A鑰匙放到另一抽屜B中鎖起來,如果需要打開A抽屜,就需要先找出B鑰匙,打開B抽屜取出A鑰匙,再打開A抽屜,取出A抽屜中之物,這就是“間接訪問”。 地址就是指針,變量的指針就是變量的地址,而存放變量地址的變量是指
7、針變量。提醒:第9頁(yè),共38頁(yè)。7.2 指向變量的指針變量7.2.1 指針變量的定義及初始化1指針變量的定義C語(yǔ)言規(guī)定所有變量在使用前必須定義,系統(tǒng)按數(shù)據(jù)類型分配內(nèi)存單元。格式:基類型 *指針變量名其中,“基類型”是該指針變量所指向的變量的類型,也就是指針變量所存儲(chǔ)變量地址的那個(gè)變量的類型。例如,以下分別定義了基類型為整型、實(shí)型和字符型的指針變量p、point1、point2。int *p;float *point1;char *point2; 提醒:定義變量時(shí),指針變量前的“*”是一個(gè)標(biāo)志,表示該變量的類型為指針型變量。第10頁(yè),共38頁(yè)。7.2 指向變量的指針變量7.2.1 指針變量的定義
8、及初始化2指針變量的初始化 那么如何使一個(gè)指針變量指向一個(gè)普通類型的變量呢?只要將需要指向的變量的地址賦給相應(yīng)的指針變量即可。 例如,下面語(yǔ)句就實(shí)現(xiàn)了指針變量p指向變量I(如圖7-3所示)。int *p; int I=3;p=&I; 當(dāng)然,指針變量也可將定義說明與初始化賦值合二為一,則上面情況也可用下面的方法實(shí)現(xiàn)。int I=3;int *p =&I;第11頁(yè),共38頁(yè)。7.2 指向變量的指針變量提醒:空指針NULL是一個(gè)特殊的值,將空指針賦值給一個(gè)指針變量以后,說明該指針變量的值不再是不定值,而是一個(gè)有效值,只是不指向任何變量。重點(diǎn):指針變量只能接收地址,例如,下面的賦值方法是錯(cuò)誤的。int
9、 *p,a=100;p=a;第12頁(yè),共38頁(yè)。7.2 指向變量的指針變量7.2.2 指針變量的引用1指針運(yùn)算符(1)取地址運(yùn)算符&。該運(yùn)算符是單目運(yùn)算符,其結(jié)合性為自右至左,其功能是取變量的地址。(2)取內(nèi)容運(yùn)算符*。也叫間接引用運(yùn)算符,其結(jié)合性為自右至左,用來表示指針變量所指的變量。在*運(yùn)算符后跟的變量必須是指針變量。 例如:int y=5; int *yptr;yptr=&y; printf(%d,*yptr);圖7-4和圖7-5分別描述了變量的存儲(chǔ)情況和指針的指向情況。第13頁(yè),共38頁(yè)。7.2 指向變量的指針變量7.2.2 指針變量的引用2指針變量的算術(shù)操作 允許用于指針的算術(shù)操作只
10、有加法和減法。假如有定義: int n,*p; 表達(dá)式p+n(n0)指向的是p所指的數(shù)據(jù)存儲(chǔ)單元之后的第n個(gè)數(shù)據(jù)存儲(chǔ)單元,而不是簡(jiǎn)單地在指針變量p的值上直接加個(gè)數(shù)值n。其中數(shù)據(jù)存儲(chǔ)單元的大小與數(shù)據(jù)類型有關(guān)。第14頁(yè),共38頁(yè)。7.2 指向變量的指針變量7.2.2 指針變量的引用3指針值的比較 使用關(guān)系運(yùn)算符、=、=和!=,可以比較 指針值的大小。 如果p和q是指向相同的類型的指針變量,并且p和q指向同一段連續(xù)的存儲(chǔ)空間(如p和q都指向同一個(gè)數(shù)組的元素),p的地址值小于q的值,則表達(dá)式pq的結(jié)果為1,否則表達(dá)式p第15頁(yè),共38頁(yè)。7.2 指向變量的指針變量【例7-1】通過指針變量訪問整型變量。
11、程序如下:main() int i=90,j=9; int *pi,*pj; /*指針變量定義*/ pi=&i; /*使指針變量pi指向i*/ pj=&j; /*使指針變量pj指向j*/ printf(%d,%dn,i,j); /*直接訪問變量i,j*/ printf(%d,%d,*pi,*pj); /*間接訪問變量i,j*/運(yùn)行結(jié)果:90,990,9第16頁(yè),共38頁(yè)。7.2 指向變量的指針變量【例7-2】演示指針運(yùn)算符的用法。程序如下:main() int a=7; /*a是一個(gè)整數(shù),被賦值為7*/ int *aptr; /*變量aptr是一個(gè)指向整數(shù)的指針*/ aptr=&a; /*把a(bǔ)
12、的地址賦給指針變量aptr*/ printf(The address of a is %pn,&a); /*%p是十六進(jìn)制的輸出格式*/ printf(The value of aptr is %pnn ,aptr); printf(The value of a is %dn,a); printf(The value of *aptr is %dnn ,*aptr); printf(&*aptr=%pn,&*aptr); /*輸出aptr所指向?qū)ο螅碼)的地址*/ printf(*&aptr=%pn,*&aptr); /*輸出aptr的地址的指向內(nèi)容(即aptr的值)*/The addres
13、s of a is FFDAThe value of aptr is FFDAThe value of a is 7The value of *aptr is 7&*aptr=FFDA*&aptr=FFDA運(yùn)行結(jié)果:第17頁(yè),共38頁(yè)。7.2 指向變量的指針變量【例7-3】輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出兩個(gè)數(shù)。程序如下:main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a;p2=&b; /*為指針變量賦值*/ if(a第18頁(yè),共38頁(yè)。7.2 指向變量的指針變量7.2.3 指針變量作函數(shù)參數(shù) 函數(shù)的參數(shù)不僅可以是整型、實(shí)型和字符型
14、,還可以是指針類型。當(dāng)是指針類型時(shí),它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。例7-4】試圖交換變量值的程序。void swap(int a,int b) int temp; temp=a; a=b; b=temp; printf(in the function swap: a=%d b=%dn,a,b);main() int i,j; i=421; j=53; printf(nbefore calling:i=%d j=%dn,i,j); swap(i,j); printf(after calling:i=%d j=%dn,i,j);第19頁(yè),共38頁(yè)。7.2 指向變量的指針變量運(yùn)行結(jié)果
15、:before calling:i=421 j=53in the function swap: a=53 b=421after calling:i=421 j=53程序分析: 此例中,i和j的值正確傳入了函數(shù)swap中,a和b是函數(shù)swap的兩個(gè)形參。a和b的值是由i和j復(fù)制得到的,是i和j的一個(gè)副本。第20頁(yè),共38頁(yè)。7.2 指向變量的指針變量【例7-5】使用指針參數(shù)將改變帶回到調(diào)用函數(shù)。void swap(int *a,int *b) int temp; temp=*a; *a=*b; *b=temp; printf(in the function swap: *a=%d *b=%dn,
16、*a,*b);main() int i,j; i=421; j=53; printf(nbefore calling:i=%d j=%dn,i,j); swap(&i,&j); printf(after calling:i=%d j=%dn,i,j);第21頁(yè),共38頁(yè)。7.2 指向變量的指針變量運(yùn)行結(jié)果:before calling:i=421 j=53in the function swap: *a=53 *b=421after calling:i=53 j=421程序分析: 該例使用指針作為參數(shù),函數(shù)改變參數(shù)的值后,能將改變帶回到調(diào)用函數(shù)。函數(shù)swap的參數(shù)是兩個(gè)指向整型變量的指針變量,
17、所以主函數(shù)在調(diào)用時(shí)必須使用&i、&j來傳遞參數(shù)。 在調(diào)用函數(shù)時(shí)千萬(wàn)注意參數(shù)的類型,如果是指針,務(wù)必要傳地址,否則后果不可預(yù)料。提醒:第22頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.1 一維數(shù)組指針的概念 所謂數(shù)組的指針,是指數(shù)組的起始地址,事實(shí)上也就是數(shù)組名。一個(gè)數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的,數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。重點(diǎn):(1)數(shù)組的指針數(shù)組在內(nèi)存中的起始地址,即數(shù)組名。(2)數(shù)組元素的指針數(shù)組元素在內(nèi)存中的起始地址。重點(diǎn):第23頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.2 一維數(shù)組的指針表示方法如果有一個(gè)數(shù)組a,其定義如下: int a5=1,3,5,7,
18、9; 數(shù)組a的元素在內(nèi)存中的分配如圖7-14所示。由圖7-14可以看出,元素a0的地址是a的值(即1010),元素a1的地址是a+1。同理,a+i是元素ai的地址。第24頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.2 一維數(shù)組的指針表示方法定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指針變量定義方法相同。例如: int a20; int *p; /*定義p為指向整型變量的指針變量*/ p=&a0; 由于數(shù)組元素a0的首地址與數(shù)組的首地址a相同,因此,賦值語(yǔ)句p=&a0等效于賦值語(yǔ)句p=a。另外,在定義指針變量時(shí),可以賦初值,如: int *p=&a0; 等價(jià)于: int *p;
19、p=&a0; 指針變量定義時(shí)的基類型,要與所指向的數(shù)組的類型一致提醒:第25頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.3 一維數(shù)組元素的引用方法為了引用一個(gè)數(shù)組元素,可以用兩種不同的方法:(1)下標(biāo)法:即指出數(shù)組名和下標(biāo)值,系統(tǒng)會(huì)找到該元素,如a3;(2)指針法:也叫地址法,就是通過給出的數(shù)組元素地址訪問某一元素,例如,通過地址a+3可以找到數(shù)組元素a3,而*(a+3)的值就是元素a3的值。第26頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.3 一維數(shù)組元素的引用方法(1)下標(biāo)法:用ai的形式訪問數(shù)組元素?!纠?-8】用下標(biāo)法輸出數(shù)組中的全部元素。main() int a5,i
20、; for(i=0;i5;i+) ai=i; for(i=0;i第27頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.3 一維數(shù)組元素的引用方法(2)地址法:采用*(a+i)或*(p+i)的形式,用間接訪問的方法來訪問數(shù)組元素,其中a是數(shù)組名,p是指向數(shù)組a的指針變量?!纠?-9】用指針法輸出數(shù)組中的全部元素。main() int a5,i; for(i=0;i5;i+) *(a+i)=i; for(i=0;i第28頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量7.3.4 通過指針引用數(shù)組元素 C語(yǔ)言規(guī)定:如果p為指向某一數(shù)組的指針變量,則p+1指向同一數(shù)組中的下一個(gè)元素。如果有如下語(yǔ)句:
21、int array10,*pointer=array;則:(1)pointer+i和array+i都是數(shù)組元素arrayi的地址,如圖7-15所示。(2)*(pointer+i)和*(array+i)就是數(shù)組元素arrayi。(3)指向數(shù)組的指針變量被賦值為數(shù)組名后也可按下標(biāo)法來使用。例如,arrayi等價(jià)于*(pointer+i)。第29頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量提醒:數(shù)組名是指針常量,始終是指向數(shù)組的首地址;而指針是一個(gè)變量,可以實(shí)現(xiàn)本身值的改變。如有數(shù)組a和指針變量p,則以下語(yǔ)句是合法的。p=a; p+;p+=3; 而“a+;”“a=p;”都是錯(cuò)誤的。重點(diǎn):在使用中應(yīng)注
22、意*(p+)與*(+p)的區(qū)別。若p的初值為a,則*(p+)的值等價(jià)于a0,*(+p)等價(jià)于a1,而(*p)+表示p所指向的元素值加1。如果p當(dāng)前指向a數(shù)組中的第i個(gè)元素,則有:“*(p-);”等價(jià)于“ai-;”;“*(+p);”等價(jià)于“a+i;”;“*(-p);”等價(jià)于“a-i;”。第30頁(yè),共38頁(yè)。7.3 指向一維數(shù)組的指針變量【例7-10】分析程序的運(yùn)行結(jié)果。main() int a5=1,3,5,7,9,I,*p; for(I=0;I5;I+) printf(%d,aI); printf(n); for(I=0;I5;I+) printf(%d,*(a+I); printf(n); for(p=a;p第32頁(yè),共38頁(yè)。7.4 指向字符串的指針變量2字符指針【例7-12】字符指針的應(yīng)用。程序如下:main() char *s=I Like C; printf(%s,s);運(yùn)行結(jié)果I Like C 此處的語(yǔ)句“char *s=I Like C;”僅是一種C語(yǔ)言表示形式,其真正的含義相當(dāng)于: char a=I Like C,*s; s=a; 其中,數(shù)組a是由C語(yǔ)言環(huán)境隱含給出的。提醒第33頁(yè),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版小程序SDK接入授權(quán)合同模板3篇
- 2025年度美容院加盟店品牌形象保護(hù)合同范本4篇
- 2025版國(guó)際合同授權(quán)委托書定制模板3篇
- 城市配送與物流配送環(huán)節(jié)的信息互聯(lián)互通考核試卷
- 常州鋰電池生產(chǎn)廠2025年度消防設(shè)備采購(gòu)合同2篇
- 二零二五年度古法工藝木屋建造技藝傳承合同4篇
- 物業(yè)設(shè)施設(shè)備維護(hù)2025年度合同3篇
- 設(shè)備租賃公司二零二五年度施工塔吊租賃合同
- 2025年代理銷售分銷鏈銷售協(xié)議
- 2025年因施工責(zé)任賠償協(xié)議
- 開展課外讀物負(fù)面清單管理的具體實(shí)施舉措方案
- 2025年云南中煙工業(yè)限責(zé)任公司招聘420人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025-2030年中國(guó)洗衣液市場(chǎng)未來發(fā)展趨勢(shì)及前景調(diào)研分析報(bào)告
- 2024解析:第三章物態(tài)變化-基礎(chǔ)練(解析版)
- 北京市房屋租賃合同自行成交版北京市房屋租賃合同自行成交版
- 《AM聚丙烯酰胺》課件
- 技術(shù)支持資料投標(biāo)書
- 老年人意外事件與與預(yù)防
- 預(yù)防艾滋病、梅毒和乙肝母嬰傳播轉(zhuǎn)介服務(wù)制度
- 《高速鐵路客運(yùn)安全與應(yīng)急處理》課程標(biāo)準(zhǔn)
- 23J916-1:住宅排氣道(一)
評(píng)論
0/150
提交評(píng)論