C語言函數中的變數問題
有一個題目如下:#include <stdio.h>
void swap(int i,int j);
int main(void){
int x=100;
int y=300;
int a=600;
int b=900;
int temp;
printf("x=%d y=%d a=%d b=%d\n",x,y,a,b);//x=100,y=300,a=600,b=900
temp=x;
x=y;
y=temp;
printf("now swap,x=%d y=%d \n",x,y);//x=300,y=100
swap(a,b);//a=900,b=600 這裡已變了
printf("now swap a=%d b=%d\n",a,b);//a=600,b=900 沒有變
return 0;
}
void swap(int i,int j)
{
int temp1;
temp1=i;
i=j;
j=temp1;
printf("after swap(a,b), a=%d b=%d\n",i,j);
}
其實本來swap函數中的引數應是swap(int *i, int *j)用傳址呼叫,就可以整個互調上題中a,b的值。只是我刻意用一般的整數參數來做。結果出現如上的狀況這中間我有點想不通。既然a和b的值在經過swap(a,b)這個涵數時已經掉換了值,為何回到main()之中,它們的值還是維持原樣呢?而為何如果採取swap(&a,&b)的話,回到main()中ab的值就會對調呢?
thanks 因為,如果是一般的方式呼叫 swap(a, b) 他是把 a,b 兩個 value 複製一份傳入 swap 這個 function
在 main 這個 scoop 裡面的 a,b 還是維持原本的 value 沒有被影響到
而 swap(&a,&b) 是把這兩個記憶體的 address 傳進去,這樣 swap 裡面操作的其實是 main scoop 的 a,b
因此在裡面做交換,就會影響到 main scoop 感謝。那為何main()當中的x,y二者互換就直接把二者的值給調換了,而不用傳址才換呢? 嗯,你可能要先釐清一下變數 scoop 的概念,在一個 function 裡面的 local var 他的 scoop 只有在這個 function
所以你在 main 裡面是操作 x,y 這個變數,你也在同一個 scoop 把它印出來,所以是會互換的
而 swap 裡面的 a,b 雖然跟 main 的 a,b 同一個名字,但他們因為是不同的 scoop
所以基本上是完全沒有任何關係的兩組變數 本帖最後由 return 於 2014-10-15 21:13 編輯
ckmarkhsu 發表於 2014-10-15 20:45
嗯,你可能要先釐清一下變數 scoop 的概念,在一個 function 裡面的 local var 他的 scoop 只有在這個 func ...
所以等於i,j(a,b)在swap互換,其實互換的是int i和int j的記憶體的內容,所以並不影響到真正於main()中的ab值。而如果是傳址 int *i, int *j,則傳進去的是&a &b,就會直接換掉a b的值了。懂了,十分感謝。:D
頁:
[1]