C語(yǔ)言課件:第11章 指針_第1頁(yè)
C語(yǔ)言課件:第11章 指針_第2頁(yè)
C語(yǔ)言課件:第11章 指針_第3頁(yè)
C語(yǔ)言課件:第11章 指針_第4頁(yè)
C語(yǔ)言課件:第11章 指針_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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、1第 11 章指針11.1 指針變量計(jì)算機(jī)將內(nèi)存分割為字節(jié)(bytes),每個(gè)字節(jié)可以存儲(chǔ)8位(bits)的信息:每個(gè)字節(jié)都有唯一的地址(address )。2指針變量程序中的每個(gè)變量占有一個(gè)或多個(gè)字節(jié)內(nèi)存。將第一個(gè)字節(jié)的地址稱為變量的地址。在下圖中,變量 i 的地址是 2000:3指針變量如果內(nèi)存中有 n 個(gè)字節(jié),可以將內(nèi)存地址的取值范圍想像成0到n 1之間的整數(shù):4指針變量可以用一種特殊的指針變量來(lái)存儲(chǔ)內(nèi)存地址。 當(dāng)采用指針變量p來(lái)存儲(chǔ)變量i的地址時(shí),稱為“p指向i”。采用圖形方式可以表達(dá)為:5聲明指針變量當(dāng)聲明一個(gè)指針變量時(shí),變量名前必須加星號(hào):int *p;聲明的指針變量p可以指向一個(gè)

2、int型對(duì)象。 注意:我們采用術(shù)語(yǔ)“對(duì)象”而不是“變量”,是因?yàn)閜 可以指向不屬于變量的內(nèi)存區(qū)域。6聲明指針變量指針變量可以和其它變量一起出現(xiàn)在聲明中int i, j, a10, b20, *p, *q;每個(gè)指針變量只能指向一種特定類型(即:引用類型)的對(duì)象:int *p; /* points only to integers */double *q; /* points only to doubles */char *r; /* points only to characters */至于具體是何種引用類型則沒(méi)有限制7取地址運(yùn)算符和間接尋址運(yùn)算符C語(yǔ)言為指針變量提供了一對(duì)特殊的運(yùn)算符為得到變

3、量的地址,可以使用&(取地址)運(yùn)算符為了訪問(wèn)指針?biāo)赶虻膶?duì)象,可以使用*(間接尋址)運(yùn)算符8取地址運(yùn)算符聲明指針變量只是為指針留出空間,但并未將其指向任何對(duì)象:int *p; /* points nowhere in particular */在使用p 之前對(duì)其進(jìn)行初始化是至關(guān)重要的。9取地址運(yùn)算符一種初始化指針變量的方法是采用某個(gè)變量的地址對(duì)其進(jìn)行賦值:int i, *p;p = &i;將變量i的地址賦給變量p ,結(jié)果是令p指向i10取地址運(yùn)算符在聲明指針變量的同時(shí)也可以對(duì)其初始化:int i;int *p = &i;甚至可以進(jìn)一步將整型變量 i 的聲明和指針變量 p的聲明合并到一條語(yǔ)句中:

4、int i, *p = &i;11間接尋址運(yùn)算符一旦指針變量指向了某個(gè)對(duì)象,就可以使用*(間接尋址運(yùn)算符)訪問(wèn)存儲(chǔ)在對(duì)象中的內(nèi)容如果p 指向i,可以采用如下方式輸出i的值: printf(%dn, *p);對(duì)變量使用&運(yùn)算符產(chǎn)生指向變量的指針,而對(duì)指針使用 *運(yùn)算符則可以返回到原始變量:j = *&i; /* same as j = i; */12間接尋址運(yùn)算符只要p指向i,*p 就是i的別名(alias )*p 擁有和 i相同的值改變 *p 的值,同時(shí)也會(huì)改變i的值13間接尋址運(yùn)算符描述*p 和i的等價(jià)關(guān)系: p = &i;i = 1;printf(%dn, i); /* prints 1

5、*/printf(%dn, *p); /* prints 1 */*p = 2;printf(%dn, i); /* prints 2 */printf(%dn, *p); /* prints 2 */14間接尋址運(yùn)算符將間接尋址運(yùn)算符應(yīng)用于未初始化的指針變量,會(huì)導(dǎo)致未定義的行為:int *p;printf(%d, *p); /* WRONG */對(duì) *p 進(jìn)行賦值則更加危險(xiǎn):int *p;*p = 1; /* WRONG */1511.3 指針賦值C語(yǔ)言允許使用賦值運(yùn)算符對(duì)指向同種類型變量的指針進(jìn)行賦值。假設(shè)聲明如下變量:int i, j, *p, *q;對(duì)指針進(jìn)行賦值的示例如下:p = &

6、i;16指針賦值另一個(gè)指針賦值的例子為:q = p;賦值的結(jié)果是:指針q與p指向相同的位置:17指針賦值如果 p 和 q 都指向變量 i,可以使用對(duì)*p或*q賦值的方法來(lái)改變i的值:*p = 1;*q = 2;任意數(shù)量的指針變量都可以指向同一個(gè)對(duì)象18指針賦值注意不要混淆概念:q = p;和*q = *p;第一條語(yǔ)句是一個(gè)指針賦值語(yǔ)句,第二條不是19*q = *p;語(yǔ)句的實(shí)際效果p = &i;q = &j;i = 1;*q = *p;2011.4 指針作為參數(shù) 通過(guò)向函數(shù)傳遞指針(而不是變量值),可以實(shí)現(xiàn)對(duì)實(shí)際參數(shù)的修改。編寫函數(shù)分離一個(gè)double型變量的整數(shù)和小數(shù)部分21指針作為參數(shù) De

7、compose函數(shù)的新定義:void decompose(double x, long *int_part, double *frac_part) *int_part = (long) x; *frac_part = x - *int_part;Decompose函數(shù)可能的原型:void decompose(double x, long *int_part, double *frac_part);void decompose(double, long *, double *);22指針作為參數(shù) 調(diào)用decompose函數(shù)的方法:decompose(3.14159, &i, &d);函數(shù)調(diào)用的結(jié)

8、果是:int_part 指向 i ,而 frac_part 指向 d:23指針作為參數(shù) Decompose函數(shù)體內(nèi)的第一條賦值語(yǔ)句將x 的值轉(zhuǎn)化為長(zhǎng)整型(long ),并將其存儲(chǔ)在指針變量int_part指向的對(duì)象中: 24指針作為參數(shù) 第二條賦值語(yǔ)句將(x - *int_part)存儲(chǔ)到 指針變量frac_part 所指向的對(duì)象:25指針作為參數(shù) Scanf函數(shù)接受的實(shí)參必須是指針:int i;scanf(%d, &i);注意:如果去掉 &運(yùn)算符,scanf函數(shù)實(shí)際接收到的參數(shù)是變量i的值。26指針作為參數(shù) 盡管scanf的參數(shù)必須是指針,但在使用中卻不一定非要使用取地址運(yùn)算符&:int i

9、, *p;p = &i;scanf(%d, p);在上例中使用 & 運(yùn)算符會(huì)導(dǎo)致錯(cuò)誤:scanf(%d, &p); /* WRONG */27指針作為參數(shù) 對(duì)于以指針為參數(shù)的函數(shù),如果參數(shù)傳遞時(shí)不小心傳遞了錯(cuò)誤的值,可能導(dǎo)致災(zāi)難性的后果。例如在調(diào)用 decompose 時(shí),省略變量前的&運(yùn)算符:decompose(3.14159, i, d);當(dāng)decompose向*int_part 和 *frac_part所表示的位置存入數(shù)值時(shí),將會(huì)試圖修改未知的內(nèi)存位置(的內(nèi)容),而不是如預(yù)期地修改i和d的值。如果在此之前聲明了 decompose的函數(shù)原型,編譯器就能夠檢測(cè)出上述錯(cuò)誤。28再次證明先聲明

10、函數(shù)類型的重要性!程序:找出數(shù)組中的最大和最小元素Enter 10 numbers: 34 82 49 102 7 94 23 11 50 31Largest: 102Smallest: 729程序:找出數(shù)組中的最大和最小元素程序max_min.c 使用名為 max_min 的函數(shù)來(lái)找出數(shù)組中的最大和最小元素。max_min函數(shù)的原型:void max_min(int a, int n, int *max, int *min);max_min函數(shù)調(diào)用示例:max_min(b, N, &big, &small);30maxmin.c#include #define N 10void max_mi

11、n(int a, int n, int *max, int *min);int main(void) int bN, i, big, small; printf(Enter %d numbers: , N); for (i = 0; i N; i+) scanf(“%d”, &bi);/輸入數(shù)組 max_min(b, N, &big, &small);/查找最大最小值 printf(Largest: %dn, big); printf(Smallest: %dn, small); return 0;31 void max_min(int a, int n, int *max, int *min) int i; *max = *min = a0; for (i = 1; i *max) *max = ai; else if (ai *b) return a; else return b;max函數(shù)的調(diào)用方式:int *p, i, j;p = max(&i, &j);函數(shù)調(diào)用結(jié)束后,p 指向 i 或 j其中之一。35指針作為返回值max函數(shù)返回的指針是作為實(shí)際參數(shù)傳入的兩個(gè)指針中的一個(gè),但這不是唯一的選擇函數(shù)也可以返回指向外部變量或指向聲明為static的局部變量的指針。注意:不要返回指向自動(dòng)局部變量的指針int *f(void) int i; return

溫馨提示

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