C語(yǔ)言上課課件第8章 指針_第1頁(yè)
C語(yǔ)言上課課件第8章 指針_第2頁(yè)
C語(yǔ)言上課課件第8章 指針_第3頁(yè)
C語(yǔ)言上課課件第8章 指針_第4頁(yè)
C語(yǔ)言上課課件第8章 指針_第5頁(yè)
已閱讀5頁(yè),還剩88頁(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、第八章第八章 指指 針針北京郵電大學(xué)出版社北京郵電大學(xué)出版社內(nèi)容提要內(nèi)容提要 指針與指針變量指針與指針變量 指針與函數(shù)指針與函數(shù) 指針與數(shù)組指針與數(shù)組 指針與字符串指針與字符串 指針數(shù)組與命令行參數(shù)指針數(shù)組與命令行參數(shù)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)基本概念基本概念-地址地址 地址:內(nèi)存單元的編號(hào)地址:內(nèi)存單元的編號(hào) ( (圖示圖示) ) 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)數(shù)據(jù)在內(nèi)存中的存儲(chǔ) ( (圖示圖示) ) 定義變量定義變量 - - 分配內(nèi)存單元分配內(nèi)存單元( (將變量名轉(zhuǎn)換為地址將變量名轉(zhuǎn)換

2、為地址) ) - - 賦值賦值 綜合圖示綜合圖示C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)基本概念基本概念-指針指針 變量的三要素:名字、類型與值變量的三要素:名字、類型與值每個(gè)變量都通過(guò)變量名與相應(yīng)的存儲(chǔ)單元相連系,具體分配哪些每個(gè)變量都通過(guò)變量名與相應(yīng)的存儲(chǔ)單元相連系,具體分配哪些單元給變量,由編譯系統(tǒng)完成變量名到對(duì)應(yīng)內(nèi)存單元地址的變單元給變量,由編譯系統(tǒng)完成變量名到對(duì)應(yīng)內(nèi)存單元地址的變換換變量分配存儲(chǔ)空間的大小由類型決定變量分配存儲(chǔ)空間的大小由類型決定變量的值則是指相應(yīng)存儲(chǔ)單元的內(nèi)容變量

3、的值則是指相應(yīng)存儲(chǔ)單元的內(nèi)容 數(shù)據(jù)的讀寫數(shù)據(jù)的讀寫根據(jù)變量的地址根據(jù)變量的地址 讀寫內(nèi)存單元的內(nèi)容讀寫內(nèi)存單元的內(nèi)容 指針指針 (pointer) (pointer) ( (圖示圖示) )變量的地址變量的地址C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)基本概念基本概念間接訪問(wèn)間接訪問(wèn) 直接存儲(chǔ):根據(jù)變量直接存儲(chǔ):根據(jù)變量地址地址存取變量值存取變量值變量地址變量地址 內(nèi)存單元內(nèi)存單元 間接存儲(chǔ):根據(jù)指針變量存取變量值間接存儲(chǔ):根據(jù)指針變量存取變量值指針變量指針變量 變量地址變量地址 內(nèi)存單元內(nèi)存單

4、元 變量訪問(wèn)圖示變量訪問(wèn)圖示C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針變量指針變量.2000200420062005整型變量整型變量i10變量變量i_pointer2001200220032000整型變量整型變量k例例 k=i; -直接訪問(wèn)直接訪問(wèn) k=*i_pointer; -間接訪問(wèn)間接訪問(wèn)10例例 k=i; k=*i_pointer; C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)基本概

5、念基本概念指向指向 指針和指針變量指針和指針變量指針:是一個(gè)變量的指針:是一個(gè)變量的地址地址 指針變量:用來(lái)存儲(chǔ)變量地址指針變量:用來(lái)存儲(chǔ)變量地址( (指針指針) )的的變量變量 指向指向變量的地址變量的地址( (指針指針) ) 變量的內(nèi)存單元變量的內(nèi)存單元C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針變量指針變量-(1)-(1) 變量的指針:變量的地址變量的指針:變量的地址 指針變量:用來(lái)存儲(chǔ)變量地址的變量指針變量:用來(lái)存儲(chǔ)變量地址的變量指針變量指針變量 另一變量另一變量 指針與指針變量指針

6、與指針變量C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針變量指針變量-(2) 指針變量的定義指針變量的定義 一般形式:一般形式: 存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名;指針名;合法標(biāo)識(shí)符合法標(biāo)識(shí)符指針變量本身的存儲(chǔ)類型指針變量本身的存儲(chǔ)類型指針的目標(biāo)變量的數(shù)據(jù)類型指針的目標(biāo)變量的數(shù)據(jù)類型表示定義指針變量表示定義指針變量不是不是*運(yùn)算符運(yùn)算符例例 int *p1,*p2; float *q ; static char *name;注意:注意:1、int *p1, *p2; 與與 int

7、*p1, p2;2、指針變量名是、指針變量名是p1,p2 ,不是不是*p1,*p23、指針變量只能指向定義時(shí)所規(guī)定類型的變量指針變量只能指向定義時(shí)所規(guī)定類型的變量4、指針變量定義后,、指針變量定義后,變量值不確定變量值不確定,應(yīng)用前必須先賦值,應(yīng)用前必須先賦值C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針變量指針變量-(3)-(3) 指針變量的類型決定了它所能指向的變量的類型指針變量的類型決定了它所能指向的變量的類型 指針變量存放的是所指向的某個(gè)變量的地址值,指針變量存放的是所指向的某個(gè)變量的

8、地址值,而普通變量保存的是該變量本身的值而普通變量保存的是該變量本身的值 指針變量并不固定指向一個(gè)變量,可指向同類型指針變量并不固定指向一個(gè)變量,可指向同類型的不同變量的不同變量 兩個(gè)指針運(yùn)算符:兩個(gè)指針運(yùn)算符:& & * *& : & : 取變量的地址取變量的地址 p=&i ; p=&i ; * * : : 取指針?biāo)赶虻膬?nèi)容取指針?biāo)赶虻膬?nèi)容 j=j=* *p ; p ; C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針變量指針變量-(4)-(

9、4) 注意注意:*與與&具有相同的優(yōu)先級(jí),結(jié)合方向從右到左。這樣,具有相同的優(yōu)先級(jí),結(jié)合方向從右到左。這樣,&*p即即&(*p),是對(duì)變量是對(duì)變量*p取地址,它與取地址,它與&a等價(jià);等價(jià);p與與&(*p)等價(jià),等價(jià),a與與*(&a)等價(jià)等價(jià).2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-指針變量,它的內(nèi)容是地址量*i_pointer-指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer-指針變量占用內(nèi)存的地址200010i_pointer*i_pointer

10、&i_pointerii_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算-(1) 指針變量的初始化指針變量的初始化 一般形式:一般形式: 存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名指針名=初始地址值初始地址值;賦給指針變量,賦給指針變量,不

11、是賦給目標(biāo)變量不是賦給目標(biāo)變量例例 int i; int *p=&i;變量必須變量必須已說(shuō)明過(guò)已說(shuō)明過(guò)類型類型應(yīng)一致應(yīng)一致例例 int *p=&i; int i;例例 int i; int *p=&i; int *q=p;用已初始化指針變量作初值用已初始化指針變量作初值例例 main( ) int i; static int *p=&i; . ( )不能用不能用auto變量的地址變量的地址去初始化去初始化static型指針型指針C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一

12、頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算-(2)-(2) 指針的賦值運(yùn)算指針的賦值運(yùn)算將變量地址值賦給指針變量將變量地址值賦給指針變量 ( (舉例舉例) )相同類型的指針變量之間的賦值相同類型的指針變量之間的賦值 ( (舉例舉例) )綜合示例綜合示例1 1C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)例例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危險(xiǎn)!危險(xiǎn)!例例 main( ) int i=10,k; int *p; p=&k; *p=i; pri

13、ntf(“%d”,*p); 指針變量必須先賦值指針變量必須先賦值,再使用再使用.2000200420062005整型變量整型變量i10指針變量指針變量p200120022003隨機(jī)隨機(jī)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算-(3)l零指針與空類型指針零指針與空類型指針 零指針:零指針:(空指針空指針) 定義定義:指針變量值為零指針變量值為零 表示:表示: int * p=0; p指向地址為指向地址為0的單元的單元,系統(tǒng)保證該單元不作它用系統(tǒng)保證該單元不作它用表示指針變量值表

14、示指針變量值沒(méi)有意義沒(méi)有意義#define NULL 0int *p=NULL: p=NULL與未對(duì)與未對(duì)p賦值不同賦值不同 用途用途: 避免指針變量的非法引用避免指針變量的非法引用 在程序中常作為在程序中常作為狀態(tài)狀態(tài)比較比較 例例 int *p; . while(p!=NULL) . void *類型指針類型指針 表示表示: void *p; 使用時(shí)要進(jìn)行使用時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換例例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;表示不指定表示不指定p是指向哪一種是指向哪一種類型數(shù)據(jù)的指針變類型數(shù)據(jù)的指針變量量C C語(yǔ)言程序設(shè)

15、計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算-(4)-(4) 指針的算術(shù)運(yùn)算指針的算術(shù)運(yùn)算加減運(yùn)算:一個(gè)指針可以加、減一個(gè)整數(shù)加減運(yùn)算:一個(gè)指針可以加、減一個(gè)整數(shù)n n,其結(jié)果與指針?biāo)笇?duì)象的數(shù)據(jù)類型有關(guān)。指針其結(jié)果與指針?biāo)笇?duì)象的數(shù)據(jù)類型有關(guān)。指針變量的值(地址)增加或減少變量的值(地址)增加或減少“n nsizeofsizeof(指針類型)(指針類型)” ( (舉例舉例) )C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)

16、計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算-(5)-(5) 指針的關(guān)系運(yùn)算指針的關(guān)系運(yùn)算 和基本類型變量一樣,指針能進(jìn)行關(guān)系運(yùn)算和基本類型變量一樣,指針能進(jìn)行關(guān)系運(yùn)算 例如:例如:p q,p = q等等- 指針的關(guān)系運(yùn)算在指向數(shù)組的指針中廣泛的運(yùn)用,假設(shè)指針的關(guān)系運(yùn)算在指向數(shù)組的指針中廣泛的運(yùn)用,假設(shè) p、q是是指向同一數(shù)組的兩個(gè)指針,執(zhí)行指向同一數(shù)組的兩個(gè)指針,執(zhí)行pq的運(yùn)算,其含義為,若表的運(yùn)算,其含義為,若表達(dá)式結(jié)果為真(非值),則說(shuō)明達(dá)式結(jié)果為真(非值),則說(shuō)明p所指元素在所指元素在q所指元素之后。所指元素之后?;蛘哒f(shuō)或者說(shuō)q所指元素離數(shù)組第一個(gè)元素更近些。所指元素離數(shù)組第一個(gè)元素更近

17、些。指針進(jìn)行關(guān)系運(yùn)算之前,指針必須初始化,另指針進(jìn)行關(guān)系運(yùn)算之前,指針必須初始化,另外,只有同類型的指針才能進(jìn)行比較外,只有同類型的指針才能進(jìn)行比較C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算-(6)-(6) 指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),但有前置后置、先用后用的考慮,務(wù)請(qǐng)小心。但有前置后置、先用后用的考慮,務(wù)請(qǐng)小心。 例如:例如: int a10, *p=a, *x; x=p+; /* x第一個(gè)元素分量,第一個(gè)元素分量, p

18、指向第二個(gè)元素指向第二個(gè)元素*/ x=+p; /* x、 p均指向數(shù)組的第二個(gè)分量均指向數(shù)組的第二個(gè)分量*/ * p+相當(dāng)于相當(dāng)于*(p+ +)。)。 *(p+)與()與(*p)+ 含義不同,前者表示含義不同,前者表示地址自增地址自增,后者表示當(dāng),后者表示當(dāng)前前所指向的數(shù)據(jù)自增所指向的數(shù)據(jù)自增。C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)2. *&a的含意是什么的含意是什么? (答:答:a )3. (*p)+相當(dāng)于什么相當(dāng)于什么? (答:答:a+ )思考:思考:1.若有定義若有定義 in

19、t a,*p; 執(zhí)行了執(zhí)行了“p=&a”,則:則: “&*p”的含意是什的含意是什么?么?(答:相當(dāng)于&a )C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)多級(jí)指針多級(jí)指針 二級(jí)指針二級(jí)指針- -說(shuō)明形式:說(shuō)明形式: - -( (舉例舉例) ) 存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 * * *指針名指針名C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)多級(jí)指針多級(jí)指針 定義定義:

20、指向指針的指針指向指針的指針 一級(jí)指針一級(jí)指針:指針變量中存放目標(biāo)變量的地址指針變量中存放目標(biāo)變量的地址p1&p2&i3P2(指針變量指針變量)i(整型變量整型變量)例例 int *p1; int *p2; int i=3; p2=&i; p1=&p2; *p1=5; 二級(jí)指針二級(jí)指針:指針變量中存放一級(jí)指針變量的地址指針變量中存放一級(jí)指針變量的地址例例 int *p; int i=3; p=&i; *p=5;&i3P(指針變量指針變量)i(整型變量整型變量)一級(jí)指針一級(jí)指針單級(jí)間接尋址單級(jí)間接尋址二級(jí)指針二級(jí)指針一級(jí)指針一級(jí)指針目標(biāo)變量目標(biāo)變量

21、二級(jí)間接尋址二級(jí)間接尋址C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè) 定義形式:定義形式:存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名;指針名;如如 char *p;例例 int i, *p; p=&i; ( )/p是二級(jí)指針,不能用變量地址為其賦值是二級(jí)指針,不能用變量地址為其賦值指針本身的存儲(chǔ)類型指針本身的存儲(chǔ)類型最終目標(biāo)變量的數(shù)據(jù)類型最終目標(biāo)變量的數(shù)據(jù)類型*p是是p間接指向?qū)ο蟮牡刂烽g接指向?qū)ο蟮牡刂?p是是p間接指向?qū)ο蟮闹甸g接指向?qū)ο蟮闹道?int i=3; int *p1;

22、 int *p2; p1=&i; p2=&p1; *p=5;ip1p23&i&p1*p2, *p1*p2 多級(jí)指針多級(jí)指針例例 三級(jí)指針三級(jí)指針 int *p; 四級(jí)指針?biāo)募?jí)指針 char *p;C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù) 函數(shù)行參為指針變量,指針變量作實(shí)參函數(shù)行參為指針變量,指針變量作實(shí)參( (舉例舉例1)1) 函數(shù)行參為指針變量,變量地址作為實(shí)參函數(shù)行參為指針變量,變量地址作為實(shí)參( (舉例舉例2)2) 注注1

23、 1:在函數(shù)中進(jìn)行對(duì)形參指針的交換不能影響到:在函數(shù)中進(jìn)行對(duì)形參指針的交換不能影響到實(shí)參實(shí)參 ( (舉例舉例3 )3 ) 注注2 2:函數(shù)中交換值時(shí)不能使用無(wú)初值的指針變量:函數(shù)中交換值時(shí)不能使用無(wú)初值的指針變量作臨時(shí)變量。作臨時(shí)變量。(舉例(舉例4 4)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針函數(shù)指針函數(shù) 指針函數(shù)指針函數(shù): :是指返回值為指針的函數(shù)是指返回值為指針的函數(shù) 定義形式:類型名定義形式:類型名 * *函數(shù)名函數(shù)名( (參數(shù)表列參數(shù)表列) ) ;例如:例如: int int

24、* *fun(int a,intfun(int a,int b) b) 函數(shù)體語(yǔ)句函數(shù)體語(yǔ)句 程序舉例程序舉例C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向函數(shù)的指針(指向函數(shù)的指針(1 1)一個(gè)函數(shù)包括一組指令序列存儲(chǔ)在某一段內(nèi)存中,這段一個(gè)函數(shù)包括一組指令序列存儲(chǔ)在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為內(nèi)存空間的起始地址稱為函數(shù)的入口地址函數(shù)的入口地址稱函數(shù)入口地址為稱函數(shù)入口地址為函數(shù)的指針函數(shù)的指針。函數(shù)名函數(shù)名代表函數(shù)的入口代表函數(shù)的入口地址地址可以定義一個(gè)指針變量,其值等于該函數(shù)

25、的入口地址,可以定義一個(gè)指針變量,其值等于該函數(shù)的入口地址,指向這個(gè)函數(shù),這樣通過(guò)這個(gè)指針變量也能調(diào)用這個(gè)函指向這個(gè)函數(shù),這樣通過(guò)這個(gè)指針變量也能調(diào)用這個(gè)函數(shù)。這種指針變量稱為數(shù)。這種指針變量稱為指向函數(shù)的指針變量指向函數(shù)的指針變量指向函數(shù)的指針變量指向函數(shù)的指針變量定義:數(shù)據(jù)類型定義:數(shù)據(jù)類型 ( (* *指針變量名指針變量名)( )( ) 如:如: intint ( (* *p)( );p)( );用指針調(diào)用函數(shù)的形式用指針調(diào)用函數(shù)的形式:(:(* *指針變量指針變量)()(實(shí)參表)實(shí)參表)程序舉例程序舉例指向函數(shù)的指針的使用步驟指向函數(shù)的指針的使用步驟C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C

26、語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向函數(shù)的指針(指向函數(shù)的指針(2 2) 注意:注意:用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,沒(méi)有參數(shù)類沒(méi)有參數(shù)類型說(shuō)明,型說(shuō)明,C C編譯系統(tǒng)也無(wú)法進(jìn)行類型檢查,因編譯系統(tǒng)也無(wú)法進(jìn)行類型檢查,因此,在使用這種形式調(diào)用函數(shù)時(shí)要特別小心。此,在使用這種形式調(diào)用函數(shù)時(shí)要特別小心。實(shí)參一定要和指針?biāo)负瘮?shù)的形參類型一致。實(shí)參一定要和指針?biāo)负瘮?shù)的形參類型一致。函數(shù)指針可以作為函數(shù)參數(shù),此時(shí),當(dāng)函數(shù)指函數(shù)指針可以作為函數(shù)參數(shù),此時(shí),當(dāng)函數(shù)指針每次指向不同的函數(shù)時(shí),可執(zhí)行不同的

27、函數(shù)針每次指向不同的函數(shù)時(shí),可執(zhí)行不同的函數(shù)來(lái)完成不同的功能來(lái)完成不同的功能C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(1 1) 數(shù)組名是一個(gè)常量指針,它的值為該數(shù)組的首地?cái)?shù)組名是一個(gè)常量指針,它的值為該數(shù)組的首地址址 指向數(shù)組的指針的定義方法與指向基本類型變量指向數(shù)組的指針的定義方法與指向基本類型變量的指針的定義方法相同的指針的定義方法相同, 例如:例如:int a10=1,3,5,7,9;int *p;p=&a2; (把數(shù)組元素把數(shù)組元素a2的

28、地址賦給指針變量的地址賦給指針變量p)p=a; (把數(shù)組的首地址賦給指針變量把數(shù)組的首地址賦給指針變量p)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(2 2) C語(yǔ)言規(guī)定:數(shù)組名代表數(shù)組首地址語(yǔ)言規(guī)定:數(shù)組名代表數(shù)組首地址,是一是一個(gè)地址常量。個(gè)地址常量。因此,下面兩個(gè)語(yǔ)句等價(jià):因此,下面兩個(gè)語(yǔ)句等價(jià):p=&a0;p=a;在定義指針變量的同時(shí)可賦初值:在定義指針變量的同時(shí)可賦初值:int a10, *p=&a0; (或或 int *p=a;

29、)等價(jià)于:等價(jià)于:int *p; p=&a0; 兩句。兩句。C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(3) 指向數(shù)組的指針變量指向數(shù)組的指針變量p&a013151719pa0:a9p9a+0p+1 或或 a+1p+9 或或 a+9*(a+9) 或或*(p+9)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針

30、(4) 通過(guò)指針引用數(shù)組元素通過(guò)指針引用數(shù)組元素 *p=5;表示對(duì)表示對(duì)p當(dāng)前所指的數(shù)組元素賦以一個(gè)值當(dāng)前所指的數(shù)組元素賦以一個(gè)值5。C規(guī)定規(guī)定:p+1指向數(shù)組的下一元素指向數(shù)組的下一元素(而不是將而不是將p值簡(jiǎn)單地加值簡(jiǎn)單地加1)。p+1意味著使意味著使p的原值(地址)加的原值(地址)加d個(gè)字節(jié)(個(gè)字節(jié)(d為一個(gè)數(shù)組元素所占為一個(gè)數(shù)組元素所占的字節(jié)數(shù))。的字節(jié)數(shù))。 如果如果p的初值為的初值為&a0,則則: p+i和和a+i就是就是ai的地址,或者說(shuō)它們指向的地址,或者說(shuō)它們指向a數(shù)組的第數(shù)組的第i個(gè)元素個(gè)元素(圖示圖示)。)。 *(p+i)或或*(a+i)是是p+i或或a+i所指向

31、的數(shù)組元素,即所指向的數(shù)組元素,即ai。 指向數(shù)組的指針變量也可以帶下標(biāo),如指向數(shù)組的指針變量也可以帶下標(biāo),如pi與與*(p+i)、 ai等價(jià)等價(jià)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(5) 例:例: 用三種方法輸出數(shù)組全部元素。用三種方法輸出數(shù)組全部元素。(1)下標(biāo)法下標(biāo)法main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (i=0;i10;i+)printf(%d,

32、 ai ) ;C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(6) (2)通過(guò)數(shù)組名計(jì)算數(shù)組元素地址通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,輸出元素的值輸出元素的值main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (i=0;i10;i+)printf(%d, *(a+i) );C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言

33、程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(7) (3)用指針變量指向數(shù)組元素main()int a10;int *p,i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (p=a;p(a+10);p+)printf(%d, *p ); 三種方法的比較:三種方法的比較:用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;而使用指針?lè)▌t執(zhí)行效率更高而使用指針?lè)▌t執(zhí)行效率更高圖示圖示C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)

34、言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向一維數(shù)組的指針(指向一維數(shù)組的指針(8)使用指針變量時(shí),應(yīng)注意:使用指針變量時(shí),應(yīng)注意: 指針變量可實(shí)現(xiàn)使本身的值改變。指針變量可實(shí)現(xiàn)使本身的值改變。P+合法;但合法;但a+不合法(不合法(a是數(shù)組名,代表數(shù)組首地址,在是數(shù)組名,代表數(shù)組首地址,在程序運(yùn)行中是固定不變的。)程序運(yùn)行中是固定不變的。) 要注意指針變量的當(dāng)前值要注意指針變量的當(dāng)前值main()int a10;int *p, i;p=a;for ( ;pa+10;p+) scanf(%d,p);printf(n);for ( ;p=0; i-) /*逆向輸出字符串逆向輸出字符串*/ printf

35、(%c,*(a+i); /* *(a+i)即)即ai */ puts(n); C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)void trans10_2_8_16(char *p,long m,int base) int r; while (m0) r=m%base; /* 求余數(shù)求余數(shù) */ if (r10) *p=r+48; /* 小于小于10的數(shù)轉(zhuǎn)換成字符后送的數(shù)轉(zhuǎn)換成字符后送p指向的元素指向的元素 */ else *p=r+55; /* 數(shù)數(shù)1015 轉(zhuǎn)換成轉(zhuǎn)換成AF 后送后送p指向的元素

36、指向的元素*/ m=m/base; p+; /*指針下移指針下移*/ *p=0; /*在最后加上字符串結(jié)束標(biāo)志在最后加上字符串結(jié)束標(biāo)志*/ 輸入:輸入:Input radix(2,8,16):16 Input a positive integer:435678輸出:輸出:6A5DEC C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)再見(jiàn)!再見(jiàn)!同學(xué)們:同學(xué)們:C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)*

37、 *(p+i)(p+i)a a數(shù)組數(shù)組a0a0a1a1a2a2aiaia9a9p pp+1,a+1p+1,a+1p+i, a+ip+i, a+ip+9, a+9p+9, a+9 綜上所述,引用一個(gè)數(shù)組元素有綜上所述,引用一個(gè)數(shù)組元素有二法:二法: (1 1)下標(biāo)法:如)下標(biāo)法:如aiai形式;形式; (2 2)指針?lè)ǎ喝纾┲羔樂(lè)ǎ喝? *(a+i)(a+i)或或 * *(p+i)(p+i)。其中其中a a是數(shù)組名,是數(shù)組名,p p是指向數(shù)組的是指向數(shù)組的指針變量,其初值指針變量,其初值p=ap=a。C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C

38、語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)變量與地址變量與地址程序中程序中: int i; float k; 內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-地址地址ik 編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量變量是對(duì)程序中數(shù)據(jù)是對(duì)程序中數(shù)據(jù)存儲(chǔ)空間的抽象存儲(chǔ)空間的抽象.2000200120022005內(nèi)存內(nèi)存02003C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針與指針變量指針與指針變量.2000200420062005整型變量整型變量i10變量變量i_

39、pointer2001200220032000指針指針指針變量指針變量 變量的變量的內(nèi)容內(nèi)容 變量的變量的地址地址指針變量指針變量變量變量變量地址變量地址(指針指針)變量值變量值指向指向地址存入地址存入指針變量指針變量C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)main( ) int a=18 , *p=&a ; printf(“a=%dn”, a); printf(“*p=%dn”, *p); a=18 *p=18指針變量的初始化指針變量的初始化4000pa(4000)18*pC C語(yǔ)

40、言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)內(nèi)存的地址編號(hào)內(nèi)存的地址編號(hào)0000101111000001000000001110101101110000200220032004200520060000C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)內(nèi)存中數(shù)據(jù)的存儲(chǔ)內(nèi)存中數(shù)據(jù)的存儲(chǔ)(1)(1)main( ) int i=1 , j=2 , k=3 ; printf(%d, %d, %d , i , j , k)

41、;F9 F9 開始編譯開始編譯C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)內(nèi)存中數(shù)據(jù)的存儲(chǔ)內(nèi)存中數(shù)據(jù)的存儲(chǔ)(2)(2)int i i=1 , j j=2 , k k=3;(編譯)(編譯)2021467-18-2921i ij jk k20022002200420042006200620082010Ctrl+F9Ctrl+F9運(yùn)行運(yùn)行C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)內(nèi)存中數(shù)據(jù)的存儲(chǔ)內(nèi)存中

42、數(shù)據(jù)的存儲(chǔ)(3)(3) int i=1,j=2,k=3;(運(yùn)行)(運(yùn)行)1 12 23 3-2921ijk20022004200620082010C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)內(nèi)存中數(shù)據(jù)的存儲(chǔ)內(nèi)存中數(shù)據(jù)的存儲(chǔ)(4)(4) int i=1,j=2,k=3;(實(shí)際情況)(實(shí)際情況)ijk200220032004200520060000000100000000000000100000000000000011000000002007C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)

43、計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)內(nèi)存中數(shù)據(jù)的存儲(chǔ)內(nèi)存中數(shù)據(jù)的存儲(chǔ)(6)(6) (程序結(jié)束(程序結(jié)束,恢復(fù)原狀)恢復(fù)原狀)2021467-18-292120022004200620082010C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)變量的訪問(wèn)變量的訪問(wèn)例 i=3; -直接訪問(wèn)指針變量.2000200420062005整型變量i10變量i_pointer20012002200320003例 *i_pointer=20; -間接訪問(wèn)20C C語(yǔ)

44、言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)202直接訪問(wèn)直接訪問(wèn)int i=1,j=2,k=3;1 1-2921i i2002(&i)2002(&i)2004200620082010C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針指針變量的地址變量的地址 int i=1,j=2,k=3;123-292120022002 ( ( &i&i ) )20042004 ( ( &

45、amp;j&j ) )20062006 ( ( &k&k ) )20082010ij kC C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)間接訪問(wèn)間接訪問(wèn)intint i=1 ; i=1 ; p p=&i ;=&i ;2002 ( &i )2002 ( &i )p p200220023000 ( &p)3000 ( &p)1 1i ip p20022002p(3000) 1 1i(2002) p(3000) 20022002C C

46、語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指向指向 int i=1;i i2002(&i)2002(&i)2004200620001 1C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針運(yùn)算指針運(yùn)算int i=1 , j ; int *p ;p=&i , j=*p ;i i2002(&i)2002(&i)200430001 1j jp p200220021 1C

47、C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針變量的類型指針變量的類型int i=5;float j=2.5;int *point;point = &i ; (語(yǔ)法正確語(yǔ)法正確)point = &j ; (語(yǔ)法錯(cuò)誤語(yǔ)法錯(cuò)誤)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針的賦值運(yùn)算指針的賦值運(yùn)算(1)(1)int a,b,*pa,*pb;a=12;b=18;pa=&a;pb=

48、&ba apapab bpbpb&a&apapa1212a a* *papa&b&b1818b b* *pbpbpbpbC C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針的賦值運(yùn)算指針的賦值運(yùn)算(2)(2)&a&apapa1212a a* *papa&b&b1818b b* *pbpbpbpb注意注意:只有相同類型的指針變量才能相互賦值,如:只有相同類型的指針變量才能相互賦值,如pf=pa;pf=pa;是不允許的。因?yàn)槭遣辉试S

49、的。因?yàn)閜apa是整型指是整型指針針,pf,pf是浮點(diǎn)型指針是浮點(diǎn)型指針int a,b,*pa,*pb;float *pf;a=12;b=18;pa=&a;pb=&b;pb=pa;C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)例例 輸入兩個(gè)數(shù),并使其從大到小輸出輸入兩個(gè)數(shù),并使其從大到小輸出main()main() int int * *p1,p1,* *p2,p2,* *p,a,b;p,a,b; scanf(%d,%d,&a,&b scanf(%d,%d,&

50、;a,&b);); p1=&a; p2=&b; p1=&a; p2=&b; if(ab) if(ab) p=p1; p1=p2; p2=p; p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(a=%d,b=%dn,a,b); printf(maxprintf(max=%d,min=%dn,=%d,min=%dn,* *p1,p1,* *p2);p2); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:a=5,b=9a=5,b=9 max=9,min=5 max=9,min=5.指針變量指針變量p1p1 指針變量指針變量p p2000

51、200020082008200220022004200420062006 指針變量指針變量p2p2 整型變量整型變量b b 整型變量整型變量a a5 5200620069 920082008200620062008200820062006C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)例:指針的算術(shù)運(yùn)算例:指針的算術(shù)運(yùn)算 int *p,a2,b4,c=6; p=&a; p=p+2246a(4000)b(4002)c(4004)2464000p2464004pa(4000)b(4002)c(4

52、004)a(4000)b(4002)c(4004)對(duì)于不同基類型的指針,指針變量對(duì)于不同基類型的指針,指針變量“加上加上”或或“減去減去”一個(gè)整數(shù)一個(gè)整數(shù)n n所移動(dòng)的字節(jié)數(shù)是不同的。所移動(dòng)的字節(jié)數(shù)是不同的。例如:例如:float a10float a10, * *p=ap=a, * *x x;p=p+3p=p+3;/ /* *實(shí)際上是實(shí)際上是p p加上加上3 3* *4 4個(gè)字節(jié)賦給個(gè)字節(jié)賦給x x, x x依然指向數(shù)組的第三個(gè)分量依然指向數(shù)組的第三個(gè)分量* */ /加減運(yùn)算常用于數(shù)組的處理。對(duì)指向一般數(shù)據(jù)的指針,加減運(yùn)算無(wú)實(shí)際意義。加減運(yùn)算常用于數(shù)組的處理。對(duì)指向一般數(shù)據(jù)的指針,加減運(yùn)算無(wú)

53、實(shí)際意義。例如:例如: intint a10 a10,* *p=ap=a,* *x;xx;x=p+3=p+3;/ /* *實(shí)際上是實(shí)際上是p p加上加上3 3* *2 2個(gè)字節(jié)賦給個(gè)字節(jié)賦給x x, x x指向數(shù)組的第三個(gè)分量指向數(shù)組的第三個(gè)分量* */ /C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)多級(jí)指針多級(jí)指針#inlude mian() int a=22,*p,*pp; p=&a; pp=&p; printf(“*p=%dn”,*p); printf(“*pp=%dn”,

54、*pp);假設(shè)變量假設(shè)變量a的地址為的地址為4000,指針,指針p的地址為的地址為4100,二級(jí)指針,二級(jí)指針pp的地址為的地址為4800。程序執(zhí)行結(jié)果:程序執(zhí)行結(jié)果: * *p=22p=22 * * *pp=22pp=22&p=4100&a=400022pp(4800) p(4100) a(4000)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b;

55、int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例例 將數(shù)從大到小輸出將數(shù)從大到小輸出C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C

56、語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2

57、010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_22000200259例例 將數(shù)從大到小輸出將數(shù)從大到小輸出運(yùn)行結(jié)果:9,5地址傳遞C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針做函數(shù)參數(shù)指針做函數(shù)參數(shù)(2)(2)#inlude main() int a,b; void swap(int *p1,int *p2); scanf(“%d%d”,&a,&b); swap(&a,&b); printf(“n a=%d,b=%dn

58、=”,a,b);程序執(zhí)行結(jié)果:程序執(zhí)行結(jié)果: 輸入:輸入:12 22 輸出:輸出:a=22,b=12 void swap(intvoid swap(int * *p1,int p1,int * *p2)p2) int int p; p; p = p = * *p1;p1; * *p1 = p1 = * *p2;p2; * *p2 = p;p2 = p; C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)運(yùn)行結(jié)果:5,9例例 將數(shù)從大到小輸出將數(shù)從大到小輸出swap(int *p1, int *p2)

59、int *p; p=p1; p1=p2; p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(%d,%d,*pointer_1,*pointer_2);.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)

60、指針p1指針p2指針p*2000地址傳遞20002002結(jié)論:在函數(shù)中進(jìn)行對(duì)行參指針的交換不會(huì)影響到實(shí)參數(shù)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(p

61、ointer_1,pointer_2); printf(n%d,%dn,a,b);運(yùn)行結(jié)果:9,9編譯警告!結(jié)果不對(duì)!int x;int *p=&x;x;例例 將數(shù)從大到小輸出將數(shù)從大到小輸出.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_2200020029920002002COPY(swap)指針p1指針p2指針p*假設(shè)2000指針變量在使用前必須賦值!C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C C語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)上一頁(yè)上一頁(yè)下一頁(yè)下一頁(yè)指針函數(shù)指針函數(shù)#include stdio.hvoid main() int a,b,*p; int *min(int x,int y);/ /* *函數(shù)提前引用說(shuō)明函數(shù)提前引用說(shuō)明* */ / int *minp(int *,int *);/ /* *函數(shù)提前引

溫馨提示

  • 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)論