這個是一個深刻理解指針和函數的問題。本來自己當初很認真的看過這個問題,可是現在搞運維去了,對linux倒是挺熟的,結果把以前的知識忘了。哎,真是悲哀。今天突然我女朋友問我,我一時還有點懵,這裏記錄一下。
void swap1(int *a,int *b)
{
int *p;
p=a;
a=b;
b=p;
}
int main()
{
int a=5,b=9;
int *p1,*p2;
p1=&a;
p2=&b;
swap1(p1,p2);
printf("%d %d\n",a,b);
}
開始就是這段代碼,我很快明白,這樣是無法成功的,因爲地址在裏面不管怎樣交換和主函數沒有一點關係。因爲函數在傳參的時候得到的是一份複製。而且這份複製在函數結束時就已經消失了,所以主函數並沒有任何變化,交換不成功。
接着我又看到下面這段代碼
void swap2(int *a,int *b)
{
int p;
p=*a;
*a=*b;
*b=p;
}
int main()
{
int a=5,b=9;
int *p1,*p2;
p1=&a;
p2=&b;
swap2(p1,p2);
printf("%d %d\n",a,b);
}
這段代碼的交換是成功的,有些人問爲什麼成功呢?按照上面的思路傳入的不是一個複製麼,爲什麼能交換成功呢?因爲雖然函數傳入的值是複製,那麼我們來看看這個複製到底是什麼。這個複製是一個指向原本變量的指針,而我們利用這個指針可以間接訪問我們需要交換的原本的變量。然後我們將原本變量交換,後面再使用*p1和*p2訪問這個兩個變量,其實p1和p2的地址並沒有變,而是所指向的內容發生了變化。
這裏我也明白了函數需要對變量進行修改時,必須傳入指針,然後利用指針間接訪問變量,再對變量進行修改。這裏也必須對函數實參和形參傳遞理解清楚。
ps:之前在這的函數已被刪除,經過評論的反饋,我發現這個函數是利用了C++的引用,而C中沒有引用,所以刪除了,感謝評論的小夥伴