對c語言指針的理解


對於下面這一段常見的代碼:

#include<stdio.h>
void swap(int u, int v)
{
int temp;
temp = u;
u = v;
v = temp;
}

int main()
{
int x = 2, y = 3;
printf("Originally x = %d and y = %d.\n", x, y);
swap(x, y); //zhi
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}
swap函數並不能滿足我們的要求:交換x和y的值。

當我們執行上面的代碼時,在內存的棧(stack)上就開始變化了。main主函數所占空間,以及屬於main函數的局部變量x和y的內存空間被開辟。在調用swap函數時,swap函數所占內存空間也在stack上被開辟,它的兩個變量u、v接收從main函數中傳過來的值,保存在相應的內存空間。見下圖比較形象一點:


現在就很容易理解為什么swap函數不能交換main函數中x和y的值了,swap和main函數在stack中的運行空間就像中間隔着柵欄一樣,屬於兩塊不同的”領土”。swap運行完后,釋放它的內存,和main沒有一點的交互。swap不管用,因為它不能介入main的內存中,所以該讓指針(pointer)上場了,讓swap有能力去操縱main中的x、y。

下面用指針l來達到我們想要的效果:

#include<stdio.h>
void swap(int * u, int * v) //這里的u、v表示期望得到的是一個int型的地址
{
int temp;
temp = *u;
*u = *v;
*v = temp;
}

int main()
{
int x = 2, y = 3;
printf("Originally x = %d and y = %d.\n", x, y);
swap(&x, &y); //這里通過&傳遞x和y的地址,告訴swap x 、y在哪里
printf("Now x = %d and y = %d.\n", x, y);
return 0;
}

所謂地址,就好比如說你高考完去上大學時,只需要知道大學的地址,你就可以順利地到達學校。知道了地址后,就可以到那個地址去做我們想做的事情。swap中的u、v保存了main中x和y的地址,這樣當swap在操作u、v時,其實就是在操作main中的x、y。swap(&x, &y);看到&這個符號,就表示這是個地址,這里指出x、y在內存的哪個地方,傳給swap后,swap也知道x、y在內存的哪個地方了,swap就可以使用在那個內存中的數據。很高興吧,swap和main開始通信了,因為我們有通訊地址。來看內存的變化:


*u,u是一個地址,×在前就表示定位到u那個地址(go to u),在swap中就可以修改不屬於它的內存。

最后總結一下:通過指針可以讓兩塊不相干的內存作用域發生聯系;想得到一個變量的地址,就在變量名前加&;*是定位符,如上面的*u和*v(u和v是地址),就是找到這些地址,然后定位到那里去。

更多詳情請看:http://v.163.com/movie/2010/3/Q/J/M6U6LS8CV_M6U6O02QJ.html

PS:想想咱們國家的計算機教育,我也是醉了。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com