C語言課件:第11章 指針_第1頁
C語言課件:第11章 指針_第2頁
C語言課件:第11章 指針_第3頁
C語言課件:第11章 指針_第4頁
C語言課件:第11章 指針_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、1第 11 章指針11.1 指針變量計算機將內(nèi)存分割為字節(jié)(bytes),每個字節(jié)可以存儲8位(bits)的信息:每個字節(jié)都有唯一的地址(address )。2指針變量程序中的每個變量占有一個或多個字節(jié)內(nèi)存。將第一個字節(jié)的地址稱為變量的地址。在下圖中,變量 i 的地址是 2000:3指針變量如果內(nèi)存中有 n 個字節(jié),可以將內(nèi)存地址的取值范圍想像成0到n 1之間的整數(shù):4指針變量可以用一種特殊的指針變量來存儲內(nèi)存地址。 當采用指針變量p來存儲變量i的地址時,稱為“p指向i”。采用圖形方式可以表達為:5聲明指針變量當聲明一個指針變量時,變量名前必須加星號:int *p;聲明的指針變量p可以指向一個

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

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

4、int i, *p = &i;11間接尋址運算符一旦指針變量指向了某個對象,就可以使用*(間接尋址運算符)訪問存儲在對象中的內(nèi)容如果p 指向i,可以采用如下方式輸出i的值: printf(%dn, *p);對變量使用&運算符產(chǎn)生指向變量的指針,而對指針使用 *運算符則可以返回到原始變量:j = *&i; /* same as j = i; */12間接尋址運算符只要p指向i,*p 就是i的別名(alias )*p 擁有和 i相同的值改變 *p 的值,同時也會改變i的值13間接尋址運算符描述*p 和i的等價關系: 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間接尋址運算符將間接尋址運算符應用于未初始化的指針變量,會導致未定義的行為:int *p;printf(%d, *p); /* WRONG */對 *p 進行賦值則更加危險:int *p;*p = 1; /* WRONG */1511.3 指針賦值C語言允許使用賦值運算符對指向同種類型變量的指針進行賦值。假設聲明如下變量:int i, j, *p, *q;對指針進行賦值的示例如下:p = &

6、i;16指針賦值另一個指針賦值的例子為:q = p;賦值的結果是:指針q與p指向相同的位置:17指針賦值如果 p 和 q 都指向變量 i,可以使用對*p或*q賦值的方法來改變i的值:*p = 1;*q = 2;任意數(shù)量的指針變量都可以指向同一個對象18指針賦值注意不要混淆概念:q = p;和*q = *p;第一條語句是一個指針賦值語句,第二條不是19*q = *p;語句的實際效果p = &i;q = &j;i = 1;*q = *p;2011.4 指針作為參數(shù) 通過向函數(shù)傳遞指針(而不是變量值),可以實現(xiàn)對實際參數(shù)的修改。編寫函數(shù)分離一個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)用的結

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

9、, *p;p = &i;scanf(%d, p);在上例中使用 & 運算符會導致錯誤:scanf(%d, &p); /* WRONG */27指針作為參數(shù) 對于以指針為參數(shù)的函數(shù),如果參數(shù)傳遞時不小心傳遞了錯誤的值,可能導致災難性的后果。例如在調(diào)用 decompose 時,省略變量前的&運算符:decompose(3.14159, i, d);當decompose向*int_part 和 *frac_part所表示的位置存入數(shù)值時,將會試圖修改未知的內(nèi)存位置(的內(nèi)容),而不是如預期地修改i和d的值。如果在此之前聲明了 decompose的函數(shù)原型,編譯器就能夠檢測出上述錯誤。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ù)來找出數(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)用結束后,p 指向 i 或 j其中之一。35指針作為返回值max函數(shù)返回的指針是作為實際參數(shù)傳入的兩個指針中的一個,但這不是唯一的選擇函數(shù)也可以返回指向外部變量或指向聲明為static的局部變量的指針。注意:不要返回指向自動局部變量的指針int *f(void) int i; return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論