版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第10章 指 針,指針是C語言中的重要概念,也是C語言的重要特色。使用指針,可以使程序更加簡(jiǎn)潔、緊湊、高效。10.1 地址和指針的概念 10.2變量的指針和指向變量的指針變量 10.3 數(shù)組與指針,10.1 地址和指針的概念,1.內(nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)(1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲(chǔ)器中,擁有大量的存儲(chǔ)單元(容量為1字節(jié))。為了方便管理,必須為每一個(gè)存儲(chǔ)單元編號(hào),這個(gè)編號(hào)就是存儲(chǔ)單元的“地址”
2、。每個(gè)存儲(chǔ)單元都有一個(gè)惟一的地址。,(2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。2.變量地址──系統(tǒng)分配給變量的內(nèi)存單元的起始地址,10.1 地址和指針的概念,假設(shè)有這樣一個(gè)程序:int i=1,j=2,k=3,l=4; /*變量定義*/,在程序中一般是通過變量名來對(duì)內(nèi)存單元進(jìn)行存取操作的.其實(shí)程序經(jīng)過編譯后已經(jīng)將變量名轉(zhuǎn)換為變量的地址,對(duì)變量值的存取都是通
3、過地址進(jìn)行的,編譯時(shí),系統(tǒng)分配2000和2001兩個(gè)字節(jié)給變量i;2002和2003兩個(gè)字節(jié)給變量j;3000和3001兩個(gè)字節(jié)給變量k;3002和3003兩個(gè)字節(jié)給變量l;,例如: (1)printf(“%d”, i);系統(tǒng)執(zhí)行:通過對(duì)應(yīng)關(guān)系從起始地址2000取出1輸出.,(2)scanf(“%d”,&i);系統(tǒng)執(zhí)行:把從鍵盤輸入的值送到地址為2000開始的存儲(chǔ)單元中.,(3)k=i+j;(如何執(zhí)行?),直
4、接訪問──直接利用變量的地址進(jìn)行存取,間接訪問──通過另一變量訪問該變量的值 C語言規(guī)定:在程序中可以定義一種特殊的變量(稱為指針變量),用來存放其它變量的地址。,例如:定義一個(gè)變量i_pointer用來存放整型變量的地址,它被分配為3010,3011兩個(gè)字節(jié).可以通過賦值語句實(shí)現(xiàn).i_pointer=&i;,兩種訪問方式的比較 兩種訪問方式之間的關(guān)系,可以用某人甲(系統(tǒng))要找某人乙(變量)來類比。一種情況是,甲知道乙在
5、何處,直接去找就是(即直接訪問)。,另一種情況是,甲不知道乙在哪,但丙(指針變量)知道,此時(shí)甲可以這么做:先找丙,從丙處獲得乙的去向,然后再找乙(即間接訪問)。,為了表示將數(shù)值3送到變量中,可以有兩種表達(dá)方法:(1)將3送到變量i所標(biāo)志的單元中。圖(a),(2)將3送到變量i_pointer所指向的單元(即i所標(biāo)志的單元)中。圖(b),指向是通過地址來體現(xiàn)的.(通過i_pointer中的2000知道i的內(nèi)存地址),指針與指針變量(1
6、)指針──即地址 一個(gè)變量的地址稱為該變量的指針。通過變量的指針能夠找到該變量。,(2)指針變量──專門用于存儲(chǔ)其它變量地址的變量指針變量i_pointer的值就是變量i的地址。指針與指針變量的區(qū)別,就是變量值與變量的區(qū)別。,例如:下面兩個(gè)語句的作用相同:i=3; /*將3直接賦給變量i*/*i_pointer=3; /*將3賦給指針變量i_pointer所指向的變量*/,10.2
7、變量的指針和指向變量的指針變量,為表示指針變量和它指向的變量之間的關(guān)系,用指針運(yùn)算符“*”表示”指向”。如果已經(jīng)定義了i_pointer為指針變量,則(*i_pointer)是i_pointer所指向的變量.,10.2.1 指針變量的定義,C語言規(guī)定所有變量在使用前必須定義,指定其類型,并按此分配內(nèi)存單元.指針變量不同于整型變量和其他類型的變量,它是專門存放地址的,必須將它定義為”指針”類型.例: int i,j; i
8、nt *pointer_1,*pointer_2;第1行定義了兩個(gè)整型的變量i,j,第2行定義了兩個(gè)指針變量pointer_1, pointer_2,它們是指向整型變量的指針變量.左端的int為”基類型”.用來指定指針變量可以指向的變量的類型.定義指針變量的一般形式為:基類型 * 指針變量名;,10.2.1 指針變量的定義,合法的定義:float *pointer_3;/*指向float型變量的指針變量*/char *p
9、ointer_4;/*指向char型變量的指針變量*/那么,怎樣使一個(gè)指針變量指向另一個(gè)變量呢?解決方法:pointer_1=&i; /*將i的地址存放到指針變量 pointer_1中*/pointer_2=&j; /*將j的地址存放到指針變量 pointer_2中*/,10.2.1 指針變量的定義,在定義指針變量時(shí)要注意:(1)指針變量前面的”*”表示該變量的類型為指針型變量.指針變量名為poin
10、ter_1,pointer_2,而不是*pointer_1,*pointer_2.(2)在定義指針變量時(shí)必須指定基類型.(考慮到指針的移動(dòng)長度),10.2.1 指針變量的定義,在定義指針變量時(shí)要注意:(3)只有整型變量的地址才能放到指向整型變量的指針變量中.例如:float a;int * pointer_1;pointer_1=&a;這是錯(cuò)誤的.,10.2.2 指針變量的引用,指針變量中只能存放地址(指針
11、),不要將一個(gè)整數(shù)賦給一個(gè)指針變量. *pointer_1=100; (錯(cuò)誤)運(yùn)算符:(1) & : 取地址運(yùn)算符.(2) * : 指針運(yùn)算符&a*p,10.2.2 指針變量的引用,[案例10.1] 通過指針變量訪問整型變量。#include main() { int a,b; int *pointer_1,*pointer_2; a=100;b=10;
12、 pointer_1 =&a; pointer_2 =&b; printf(“%d, %d\n”, a, b); printf(“%d, %d\n”, *pointer_1,*pointer_2); },運(yùn)行結(jié)果:100,10100,10,10.2.2 指針變量的引用,對(duì)程序的說明:(1)在開頭處雖然定義了兩個(gè)指針變量pointer_1,pointer_2,但他們
13、并未指向任何一個(gè)整型變量,只是提供兩個(gè)指針變量,規(guī)定它們可以指向整型變量,至于指向哪一個(gè),要在程序語句中指定.程序第6、7行的作用就是使pointer_1指向a,pointer_2指向b。(2)最后一行的*pointer_1,*pointer_2就是變量a,b。最后兩個(gè)printf函數(shù)作用是相同的。,10.2.2 指針變量的引用,對(duì)程序的說明:(3)程序中有兩處出現(xiàn)*pointer_1,*pointer_2,但含義不同。第4行的
14、表示定義兩個(gè)指針變量pointer_1,pointer_2。它們前面的“*”只是表示該變量是指針變量。最后一行的表示pointer_1,pointer_2所指向的變量。(4) pointer_1 =&a; 不要寫成*pointer_1 =&a;,10.2.2 指針變量的引用,對(duì)“&”和”*”的說明: (如果執(zhí)行了語句pointer_1 =&a; )(1)&*pointer_1含義?(&
15、amp;,*優(yōu)先級(jí)相同,自右而左結(jié)合) pointer_2 = &*pointer_1;,&a,10.2.2 指針變量的引用,對(duì)“&”和”*”的說明: (如果執(zhí)行了語句pointer_1 =&a; )(2) *&a含義?(&,*優(yōu)先級(jí)相同,自右而左結(jié)合)等價(jià)于*pointer_1,a,10.2.2 指針變量的引用,對(duì)“&”和”*”的說明: (3) (*pointe
16、r_1)++ 相當(dāng)于a++;(圖a,b)*pointer_1++(右結(jié)合)相當(dāng)于*(pointer_1++)先求*pointer_1(得a),再使pointer_1值改變,這樣pointer_1不再指向a了.,,10.2.2 指針變量的引用,[案例10.2] 輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a,b。#include main() { int *p1,*p2,*p,a,b; scanf(“%
17、d,%d”,&a,&b); p1 =&a; p2 =&b; if(a<b){p=p1;p1=p2;p2=p;} printf(“a=%d, b=%d\n\n”, a, b); printf(“max=%d, min=%d\n”, *p1,*p2); },運(yùn)行結(jié)果:5,9a=5,b=9max=9,min=5,10.2.2 指針變
18、量的引用,a和b并未交換,它們?nèi)匀槐3衷?但p1和p2的值改變了.,10.2.3 指針變量作為函數(shù)參數(shù),函數(shù)的參數(shù)不僅可以是整型,浮點(diǎn)型,字符型,還可以是指針類型.它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中.,[案例10.3]輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a,b。void swap(int *p1, int *p2) { int temp; temp=*p1;*p1=*p2;*p2=temp
19、; },[案例10.3]輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a,b。main() { int a,b; int *pointer_1, * pointer_2; scanf(“%d,%d”,&a,&b); pointer_1=&a;pointer_2 =&b; if(a<b) swap(pointer_1, point
20、er_2); printf(“\n%d,%d\n”,a,b);},,,pointer_1,a,(d),10.2.3 指針變量作為函數(shù)參數(shù),注意:交換*p1和*p2的值是如何實(shí)現(xiàn)的.若寫成:void swap(int *p1, int *p2) { int *temp; *temp=*p1;*p1=*p2;*p2=*temp; }不能這樣寫.由于temp中值的不確定性,可能導(dǎo)
21、致破壞重要數(shù)據(jù).本例中采用的是交換a,b的值,而p1,p2的值不變.,10.2.3 指針變量作為函數(shù)參數(shù),void swap(int x, int y) { int temp; temp=x; x=y; y=temp; }思考:是否也可達(dá)到同樣目的?,10.2.3 指針變量作為函數(shù)參數(shù),在函數(shù)調(diào)用時(shí),a的值傳送給x,b的值傳送給y.執(zhí)行完swap函數(shù)后,
22、x,y的值是互換了,但并未影響到a,b的值.在函數(shù)結(jié)束時(shí),變量x,y釋放了,main 函數(shù)中的a,b并未交換. 由于“單向傳送”的“值傳遞”方式,形參值的改變不能使實(shí)參的值隨之改變.,10.2.3 指針變量作為函數(shù)參數(shù),為了使在函數(shù)中改變了的變量值能被main函數(shù)所用,不能采取上述把要改變值的變量作為參數(shù)的辦法,而應(yīng)該用指針變量作為函數(shù)參數(shù),在函數(shù)執(zhí)行過程中使指針變量所指向的變量值發(fā)生變化,函數(shù)調(diào)用結(jié)束后
23、,這些變量值的變化依然保留下來,這樣就實(shí)現(xiàn)了“通過調(diào)用函數(shù)使變量的值發(fā)生變化,在主調(diào)函數(shù)中可以使用這些改變了的值“的目的.,[案例10.4] 輸入3個(gè)整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實(shí)參來實(shí)現(xiàn)。#includevoid swap(int *pt1, int *pt2) { int temp; temp=*pt1;*pt1=*pt2;*pt2=temp;
24、 },[案例10.4] 輸入3個(gè)整數(shù),按降序(從大到小的順序)輸出。要求使用變量的指針作函數(shù)調(diào)用的實(shí)參來實(shí)現(xiàn)。void exchange(int *q1,int *q2,int *q3){if(*q1<*q2) swap(q1,q2);if(*q1<*q3) swap(q1,q3);if(*q2<*q3) swap(q2,q3);},[案例10.4] 輸入3個(gè)整數(shù),按降序(從大到小的順序)輸出
25、。要求使用變量的指針作函數(shù)調(diào)用的實(shí)參來實(shí)現(xiàn)。void main(){ int a,b,c; int *p1,*p2,*p3; scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2 =&b;p3=&c; exchange(p1,p2,p3); printf("\n%d,%d,%d\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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 語言程序設(shè)計(jì)試(2)
- c語言程序設(shè)計(jì)ppt課件_第2章_簡(jiǎn)單程序設(shè)計(jì)-
- 語言程序設(shè)計(jì)認(rèn)識(shí)
- 《c語言程序設(shè)計(jì)》
- 1程序設(shè)計(jì)語言1程序設(shè)計(jì)語言的分類
- c語言程序設(shè)計(jì)
- c語言程序設(shè)計(jì)
- c語言程序設(shè)計(jì)
- c語言程序設(shè)計(jì)
- java語言程序設(shè)計(jì)-程序流程
- c語言程序設(shè)計(jì)教程 (第2版)
- 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)vb語言程序設(shè)計(jì)
- 大學(xué)計(jì)算機(jī)c語言程序設(shè)計(jì)(程序設(shè)計(jì))
- c語言程序設(shè)計(jì)ppt-第2版-第7章-指針程序設(shè)計(jì)
- c語言程序設(shè)計(jì)(譚浩強(qiáng))
- 匯編語言程序設(shè)計(jì)
- c語言程序設(shè)計(jì)教程
- c語言程序設(shè)計(jì)3
- 高等語言程序設(shè)計(jì)題庫a
- c語言程序設(shè)計(jì)論文
評(píng)論
0/150
提交評(píng)論