第8章 地址與指針_第1頁
第8章 地址與指針_第2頁
第8章 地址與指針_第3頁
第8章 地址與指針_第4頁
第8章 地址與指針_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本章要點本章要點:8.1 變量的地址和指針 8.2 指針變量的定義和指針變量的基類型 8.3 給指針變量賦值8.4 對指針變量的操作 8.5 函數(shù)之間地址值的傳遞 第8章 指針8.1 變量的地址和指針變量的地址和指針1變量及其地址C編譯系統(tǒng)會根據(jù)定義中變量的類型分配內(nèi)存空間:如char型占1個字節(jié),short int占2個字節(jié),int型和float型占4字節(jié),double型占8字節(jié),指針變量占4字節(jié),從而確定了這個變量的地址。變量的地址起尋找變量的作用,就像一個指針指向了變量,所以常把變量的地址稱為“指針”。例如char a,short int b, float c; 編譯系統(tǒng)給變量分配存儲空

2、間如下:圖8.1 變量分配的存儲單元與地址2指針變量 指針變量:指專用于存放另一個變量的地址(指針)。指針的對象:當把變量的地址存入指針變量后, 我們就可以說這個指針指向了該變量。變量的存取方法:直接存取和間接存取。 直接存取:直接根據(jù)變量名(即變量的地址)存取數(shù)據(jù)。 間接存取:通過指針變量間接得到變量地址,再存取變量的值。 在C程序中,變量的地址可以通過運算符“&”來得到,該運算符稱為“取地址”運算符,它的運算對象是變量或數(shù)組元素,得到的結(jié)果是變量或數(shù)組元素的地址。如:int a,b10;&a: 得到的是變量a的地址&b5: 得到的是數(shù)組元素b5的地址8.2 指針變量

3、的定義和指針變量的基類型指針變量的定義和指針變量的基類型1指針變量的定義與初始化定義指針變量的一般形式為:類型名 *指針變量名1,*指針變量名2,;功能:定義指向給定“數(shù)據(jù)類型”的變量或數(shù)組元素的指針變量,同時給該變量賦“初值”。例如:int *pi, *pj=&a;(pi只能存放int型變量的地址) double *pd;(pd只能存放double型變量的地址)以下定義的p為一個指向指針的指針變量(畫出變量間的關(guān)系):int *p,*s,k=20;s=&k;p=&s; 2指針變量的基類型一個指針變量中存放的是一個存儲單元的地址值。這里的“一”所代表的字節(jié)數(shù)是不同的:對

4、整型而言,它代表2個字節(jié);但對實型而言,它就代表4個字節(jié)。這即是不同基類型的含義。后面的章節(jié)中涉及到指針的移動,也就是要對地址進行增減運算,這時指針移動的最小單位是一個存儲單元,而不是一個字節(jié)。因此對于基類型不同的指針變量,其內(nèi)容增1、減1所“跨越”的字節(jié)數(shù)是不同的。8.3 給指針變量賦值給指針變量賦值8.3.1 給指針變量賦地址值(1)通過求地址運算(&求地址運算符)獲得地址值一般格式為: 指針變量名地址表達式例如:int k, *p, *q; q=&k;(變量k的地址賦給q,即p指向k。)(2)通過指針變量獲得地址值通過賦值運算,把一個指針變量的地址值賦給另一個指針變量,使

5、這兩個指針變量指向同一地址。例如p=q;(使指針變量p中也存放了變量k的地址,即指針變量p和q都指向了變量k。)注意:在賦值號兩邊指針變量的基類型必須相同。(3)通過標準函數(shù)獲得地址值可以通過調(diào)用庫函數(shù)malloc和calloc在內(nèi)存中開辟動態(tài)存儲單元,并把所開辟的動態(tài)存儲單元的地址賦給指針變量。8.3.2 給指針變量賦“空”值除了給指針變量賦地址值外,還可以給指針變量賦NULL值。例如:p=NULL;NULL是在stdio.h頭文件中的預定義符。NULL的代碼值為0,當p=NULL時,稱p為空指針。因為NULL的代碼值是0,所以上面語句等價于:p=0; 或 p=0;這時,指針p并不是指向地址

6、為0的存儲單元,而是具有一個確定的值“空”。企圖通過一個空指針去訪問一個存儲單元時,將會得到一個出錯信息。8.4 對指針變量的操作對指針變量的操作8.4.1 通過指針來引用一個存儲單元1取地址運算符(&)和指針運算符(*)與指針有關(guān)的運算符主要有兩個,分別是“取地址運算符(&)”和“指針運算符(*)”。(1)&運算符。為取地址運算符,其作用是返回操作對象(變量或數(shù)組元素)的地址。例如,“&x;”返回變量x的地址,“&a5;”返回的是數(shù)組元素a5的地址。(2)*運算符。為指針運算符,其作用是返回指針變量所指向變量的值。 它們都是單目運算符,優(yōu)先級高于所有的

7、雙目運算符,它們的結(jié)合性均是自右向左。在使用這兩個運算符需要注意以下幾點:(1)如果已經(jīng)執(zhí)行了“p=&a;”語句,若有&*p由于“&”和“*”兩個運算符的優(yōu)先級別相同,但按自右向左方向結(jié)合,因此先運算*p,它就是變量a,再執(zhí)行&運算。因此它等同于&a。(2)*&a的含義是a。因為先進行&a運算,得到a的地址,再進行*運算,即&a所向的變量,因此*&a等價于a。(3)(*p)+相當于a+。注意括號是必要的,如果沒有括號,就成為*(p+),這時使指針變量本身增1,并不是使p所指的存儲單元的值增1。2通過指針引用存儲單元例如:

8、int *p, k=4, q;p=&k;q=*p;即把p所指存儲單元(k)的內(nèi)容(4)賦予變量q,*p代表p所指向的變量k。上面語句等價于q=k; 間接訪問運算符*必須出現(xiàn)在運算對象的左邊,其運算對象是地址或者是存放地址的指針變量。即*號右邊也可以是地址值,如q=*(&k); 表達式&i求出變量i的地址,以上賦值語句表示取地址&k中的內(nèi)容賦給q。由于*和&的優(yōu)先級相同,且自右向左結(jié)合,因此表達式中的括號可以省略,即q=*&k; 下面的語句取指針變量p所指向的存儲單元中的內(nèi)容加1后賦給變量q:q=*p+1;例8.1(P97) 用指針指向兩個變量,通

9、過指針運算選出值小的那個數(shù)。 #include void main() int a,b,min,*pa,*pb,*pmin; pa=&a;pb=&b;pmin=&min; printf(input 2 interger numbers:); scanf(%d%d,pa,pb);/輸入的值依次放入pa、pb所指存儲單元中 printf(a=%d b=%dn,a,b);/通過輸出,驗證a、b中的值 *pmin=*pa;/假定a中的值最小,將其賦給min if(*pa*pb) *pmin=*pb;/若b中的值比a小,將其賦給min printf(min=%dn,min);/輸

10、出小值8.4.2 移動指針p+1:移動幾個字節(jié)由指針變量所指向的數(shù)據(jù)類型決定 當指針指向一串連續(xù)的存儲單元時,可對指針變量進行加或減一個整數(shù)、或通過賦值運算,使指針移動。p+1:指針向地址值大的方向移動一個存儲單元,指針基類型決定一個存儲單元所占的字節(jié)。p-1: 指針向地址值小的方向移動一個存儲單元,指針基類型決定一個存儲單元所占的字節(jié)。8.4.3 指針比較在關(guān)系表達式中,可以對兩個指針進行比較,即兩個變量地址的比較。如:p,q是兩個指針變量,if(pq) printf(“p points to lower than q.n”);通常,兩個或兩個以上的指針指向同一目標時比較才有意義。8.5 函

11、數(shù)之間地址值的傳遞函數(shù)之間地址值的傳遞8.5.1 形參為指針變量時,實參和形參之間的數(shù)據(jù)傳遞若形參為指針類型,調(diào)用該函數(shù)時,對應(yīng)的實參必須是基類型相同的地址值或者是已指向某個存儲單元的指針變量。8.5.2 通過傳送地址值,在被調(diào)用函數(shù)中直接改變調(diào)用函數(shù)中的變量的值(通過形參值的改變,改變是實參的值)8.5.3 函數(shù)返回地址值函數(shù)值的類型不僅可以是簡單的數(shù)據(jù)類型,而且還可以是指針類型。其一般形式為:類型名 *函數(shù)名(形式參數(shù)說明列表)函數(shù)的調(diào)用形式:p=函數(shù)名(實際參數(shù)列表),其中p通常是調(diào)用函數(shù)中定義的一個指針變量。例8.2(P99) 編寫函數(shù)myadd(int * a,int *b),函數(shù)中

12、把指針a和b所指的存儲單元中的兩個值相加,然后將和值作為函數(shù)值返回。在主函數(shù)中輸入兩個數(shù)給變量,把變量地址作為實參,傳送給對應(yīng)形參。#include/形參調(diào)用時分配存儲空間,調(diào)用完畢后釋放存儲空間int myadd(int *a,int *b) int sum;sum=*a+*b;return sum; void main()int x,y,z;printf(Enter x,y:);scanf(%d%d,&x,&y);z=myadd(&x,&y);/將實參x、y的地址賦給指針變量a和bprintf(%d+%d=%dn,x,y,z);例8.3(P100) 調(diào)用sw

13、ap函數(shù),交換主函數(shù)中變量x和y中的數(shù)據(jù)。/指針變量作為形參時,調(diào)用時分配空間,結(jié)束后釋放空間#includevoid swap(int *,int *);void main()int x=30,y=20;printf(1)x=%d y=%dn,x,y);swap(&x,&y);/將變量x和y的地址傳遞給指針變量a和bprintf(4)x=%d y=%dn,x,y);/在被調(diào)函數(shù)中變量的值被改變,返回到主調(diào)函數(shù)時,變量的值即是更新后的值 void swap(int *a,int *b)int t;printf(2)a=%d b=%dn,*a,*b);t=*a;*a=*b;*b=

14、t;/交換變量x和y的值printf(3)a=%d b=%dn,*a,*b);例8.4(P100) 編寫函數(shù)order(int *a,int *b),使調(diào)用函數(shù)中的第一個實參總是存放兩個數(shù)中較小的數(shù),第二個參數(shù)存放兩個數(shù)中較大的數(shù)。#includevoid swap(int *x1,int *x2)int t;t=*x1;*x1=*x2;*x2=t; void order(int *a,int *b)if(*a*b) swap(a,b); void main()int x,y;printf(Enter x,y:);scanf(%d%d,&x,&y);printf(x=%d y=

15、%dn,x,y);order(&x,&y);printf(x=%d y=%dn,x,y);例8.5(P101)以下函數(shù)把主函數(shù)中變量i和j中存放較大數(shù)的那個地址作為函數(shù)值返回。#includeint * fun(int *,int *);void main()int *p,i,j;printf(Enter two numbers:);scanf(%d%d,&i,&j);p=fun(&i,&j);/p將得到i或j的地址printf(i=%d,j=%d,*p=%dn,i,j,*p); int *fun(int *a,int *b)/函數(shù)的返回值類型為

16、指針類型(地址值)if(*a*b) return a;return b; 編程實現(xiàn)改變變量的值和改變指針指向內(nèi)容的區(qū)別,將輸入編程實現(xiàn)改變變量的值和改變指針指向內(nèi)容的區(qū)別,將輸入的三個數(shù),按從大到小的順序排列。的三個數(shù),按從大到小的順序排列。#includevoid main()int *pointer1,*pointer2,*pointer3,a,b,c;void swap(int *,int *,int *);printf(please input three numbers:);scanf(%d%d%d,&a,&b,&c);pointer1=&a,poin

17、ter2=&b,pointer3=&c;printf(1)the sorted numbers are:a=%d,b=%d,c=%d.n,a,b,c);swap(pointer1,pointer2,pointer3);printf(3)the sorted numbers are:a=%d,b=%d,c=%d.n,a,b,c);printf(4)the sorted numbers are:*pointer1=%d,*pointer2=%d,*pointer3=%d.n,*pointer1,*pointer2,*pointer3);void swap(int *p1,int *p2,int *p3)int t; /改變指針變量所指向的變量的值,能實現(xiàn)大小順序排列if(*p1*p2) t=*p1;*p1=*p2;*p2=t;if(*p1*p3) t=*p1;*p1=*p3;*p3=t;if(*p2*p3) t=*p2;*p2=*p3;*p3=t;printf(2

溫馨提示

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

評論

0/150

提交評論