C語言的那些小秘密之指針(一)_第1頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、c語言的那些小秘密之指針(一) 懂得的人都知道,c語言之所以強(qiáng)大,以及其自由性,絕大部分體現(xiàn)在其靈便的指針運(yùn)用上。因此,說指針是c語言的靈魂,一點都不為過。所以從我的標(biāo)題加了個(一)也可以看出指針的重要性,我盡可能的向大家交代清晰我對于指針的理解。所以在講解的過程中我盡可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中挺直copy下去即可運(yùn)行,希翼下面的講解能夠?qū)δ阌兴鶇f(xié)助。 首先讓我們來看看定義一個指針的普通形式為:基類型 *指針變量名看了上面的指針的定義形式,我們可能對于有些地方會有懷疑,如為什么要指定基類型呢?由于我們都

2、知道整型和字符型在內(nèi)存中占的字節(jié)數(shù)是不相同的,當(dāng)我們舉行指針的移動和指針的運(yùn)算時,假如指針指向的是一個整型變量,那么指針移動一個位置就是移動4個字節(jié),但是假如指針指向的是一個字符型的變量,那么指針移動的就是一個字節(jié),因此我們必需規(guī)定指針變量所指向的基類型。為了不枯燥的講解我們來看看下面的代碼吧。(注重:本博客的全部代碼均用法vc6編譯運(yùn)行,所以可能有的規(guī)章跟c語言的稍有區(qū)分)includeint main()int a,b;int *pointer_1,*pointer_2;a=100;b=200;pointer_1=&a;pointer_2=&b;printf("-

3、變換前-n");printf("a=%dtb=%dn",a,b);printf("*pointer_1=%dt*pointer_2=%dn",*pointer_1,*pointer_2);*pointer_1=300;int c=500;pointer_2=&c;printf("-變換后-n");printf("a=%dt*pointer_1=%dn",a,*pointer_1);printf("c=%dtb=%dt*pointer_2=%dn",c,b,*pointer_2)

4、;運(yùn)行結(jié)果如下:在此我們定義了兩個整型指針int *pointer_1,*pointer_2;,它們分離指向變量a和b,值得注重的是*pointer_1和a、*pointer_2和b是共用同一個存儲空間的,當(dāng)我們在接下類的代碼中轉(zhuǎn)變 *pointer_1=300;時,由輸出就可以看出來a的值也尾隨發(fā)生了轉(zhuǎn)變。但是當(dāng)我們聲明白一個 int c=500;之后,用法pointer_2=&c;,b的值不變,僅僅是轉(zhuǎn)變*pointer_2,由于我僅僅是轉(zhuǎn)變了*pointer_2指向了c的存儲空間,假如有有愛好的讀者可以自己驗證下假如我們修改了a的值之后*pointer_1的值會尾隨一起轉(zhuǎn)變,由于

5、他們指向的是同一個存儲空間。接下來看看如何在函數(shù)的參數(shù)中來用法指針。includeswap(int p1,int p2)int temp;temp=p1;p1=p2;p2=temp;int main()int a,b;int *pointer_1,*pointer_2;int c,d;c=a;d=b;pointer_1=&a;pointer_2=&b;a=20;b=30;swap(a,b);printf("a=%dtb=%dn",a,b);printf("a=%dtb=%dn",*pointer_1,*pointer_2);printf(

6、"c=%dtd=%dn",c,d);初步分析上面的代碼,看似是要通過一個函數(shù)的調(diào)用來實現(xiàn)一個a、b的交換,還有就是通過c=a;、 d=b;來實現(xiàn)對c、d賦初值。先來看看下面的運(yùn)行結(jié)果:結(jié)果跟我們想象的不一樣,a、b沒有實現(xiàn)交換的緣由是由于我們用法的是傳值,而不是傳址,所以調(diào)用的過程中做的處理就是把a(bǔ)、b的值復(fù)制到另外申請的兩個空間p1、p2中去,因而交換操作是在p1、p2的空間中舉行的,所以對于a、b的值并沒有影響。c、d的初值為什么沒有跟a、b的值一樣呢,由于我們在初始化的過程中給c、d賦初值的時候a、b的并沒有給定初值,所以a、b的初值是在編譯的過程中由系統(tǒng)給定的,又由

7、于我們申請的c、d的空間是跟a、b沒有任何關(guān)系的,所以接下來再對a、b賦初值的時候c、d的初值并不會轉(zhuǎn)變。下一個代碼:includeswap(int *p1,int *p2)int *temp;temp=p1;p1=p2;p2=temp;int main()int a,b;int *pointer_1,*pointer_2;int c,d;c=a;d=b;pointer_1=&a;pointer_2=&b;a=20;b=30;printf("*調(diào)用前*n");printf("a=%dtb=%dn",a,b);swap(pointer_1,

8、pointer_2);printf("*調(diào)用后*n");printf("a=%dtb=%dn",a,b);printf("*pointer_1=%dt*pointer_2=%dn",*pointer_1,*pointer_2);printf("c=%dtd=%dn",c,d);return 0;看看上面這個代碼似乎滿足了我們前面說的傳址的要求,那先讓我們來看看試驗結(jié)果吧。結(jié)果似乎也是出乎我們的意料之外,為什么用法了傳值卻還是沒有能夠?qū)崿F(xiàn)呢?假如我們在調(diào)用函數(shù)中加上一句 printf("*p1=%dt*p2

9、=%dn",*p1,*p2);,得到下面的結(jié)果:從結(jié)果來看似乎告知我們,我們已經(jīng)實現(xiàn)交換了,但是為什么沒有能夠返回歸呢?在這里要注重了,由于我們在函數(shù)的交換語句僅僅是轉(zhuǎn)變了局部指針變量p1和p2的值,所以沒有轉(zhuǎn)變a、b的值,所以用法printf("*p1=%dt*p2=%dn",*p1,*p2);使得我們確實看到了a、b交換的假象,僅僅是轉(zhuǎn)變了局部變量p1和p2的值。下一個代碼:includeincludeswap(int *p1,int *p2)int *temp;temp=(int *)malloc(sizeof(int);*temp=*p1;*p1=*p2;

10、*p2=*temp;free(temp);int main()int a,b;int *pointer_1,*pointer_2;int c,d;c=a;d=b;pointer_1=&a;pointer_2=&b;a=20;b=30;printf("*調(diào)用前*n");printf("a=%dtb=%dn",a,b);swap(pointer_1,pointer_2);printf("*調(diào)用后*n");printf("a=%dtb=%dn",a,b);printf("*pointer_1=%dt*pointer_2=%dn",*pointer_1,*pointer_2);printf("c=%dtd=%dn",c,d);return 0;看看也行結(jié)果:最后最終浮現(xiàn)了一個我們想要的結(jié)果了。從以上的分析讀者自己也知道緣由所在了吧,這里操作的才是p1、p2所指向的地址,才真正的做到了對于a、b存儲空間的數(shù)值的交換。精心的讀者可能看到了我們在代碼中用了紅色部分標(biāo)志的代碼,它徹低可以用一句int temp;來替代,之所以我們

溫馨提示

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

評論

0/150

提交評論