C語言利用指針在函數中交換兩個數的思考

這個是一個深刻理解指針和函數的問題。本來自己當初很認真的看過這個問題,可是現在搞運維去了,對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中沒有引用,所以刪除了,感謝評論的小夥伴

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章