呼叫函式時,到底什麼時候要用指標接收,看完就不難理解了(Swap交換函式為例)
在這裡我通過講解一個交換函式來講解一下什麼時候傳參需要用指標接收。
這裡先看一段程式碼,很多初學者對指標掌握不夠,經常會寫出這樣的程式碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> void Swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 10; int b = 20; Swap(a,b); printf("a=%d b=%d\n", a, b); system("pause"); return 0; }
這樣的程式碼除錯也沒有問題,邏輯就是將a,b傳入Swap函式,Swap函式就是實現交換功能的,但當我們執行會發現a,b的值並沒有交換,如圖:
這是為什麼呢?我們會發現我們的交換函式寫的並沒有問題,可是為什麼不能完成交換?這裡就我們就需要自己除錯程式了,按F10 開始除錯程式,這裡附上除錯部分截圖:
剛開始除錯,主函式剛開始,未執行時a,b值分別為5241300 5241280,按F10往下逐過程除錯
執行完12,13行的賦值語句,我們發現a,b的值已經變為賦值的10和20,這時來到Swap函式,進入函式之前,我們在監視框中新增&a和&b,對a,b的地址進行監視,得到a,b的地址分別為0x00effbf8,0x00effbec;
此時來到了Swap函式,按F11進入函式內部,這時在下面監視框里加上x,y,我們會發現a,b的值已經傳給了x和y,這裡同樣監視新增&x,&y,得到x和y的地址分別為0x00effb14,0x00effb18
很明顯,雖然 將a,b的值傳給了x,y,但是a,b的地址與x,y的地址卻不相同,那麼改變x,y的值會改變a,b 的值嗎?按F10繼續除錯
把Swap函式執行到最後一行,我們發現x和y的值確實發生了交換,這時我們繼續除錯,看看a,b的值是否發生了交換;
我們發現a,b的值並沒有發生交換,那麼這就說明上面的問題了,地址不同,改變x,y的值並不能改變a,b的值。這裡a,b叫實參,x,y叫形參,改變形參的值實參不會發生改變。那麼要改變a,b的值,就要把地址傳給x,y,說到地址大家就會想到指標,指標變數就是存放地址的,那麼這裡先給出正確的程式碼:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void Swap(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a, &b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
這裡在傳參時傳a,b的地址,所以寫為 Swap(&a,&b); 而要接收地址,就要用指標變數來接收,指標變數就是存放地址的。
在這裡舉個例子: *p = 20; 這個程式碼理解為:通過p找到地址,並把20賦值給此地址所指的值。
int *p = # 這裡為了方便理解寫成 int * p =# 表示為p是一個地址,型別是整形指標變數,這 樣就很好理解了
加上上面的題目,我想大家很好理解為什麼要用指標了,如果要改變傳入引數的值,就必須傳指標。
最後給出結果: