函式的傳值和傳址呼叫(C語言)
第一篇部落格,寫的不是太清楚當練個手用吧。
1:傳值呼叫。傳值呼叫顧名思義就是將引數的值傳遞給函式,而函式在進行呼叫時會複製這個值,然後將複製的值在函式中進行呼叫。
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main(void)
{
int x = 1, y = 2;
swap(x, y);
printf("%d %d\n", x, y);
return 0;
}
這是一個swap函式,用來交換兩個變數的值,然後在主函式中呼叫了這個函式目的是將x, y兩個變數的值進行交換, 但是這個函式卻達不到目的。
分析一下這個函式, 首先是一個void型別無返回值的函式,a和b是兩個整型的形式引數,然後交換其兩個變數的值。
主函式中 swap(x, y), x和y是實際引數, 函式在呼叫的時候首先會複製x和y的值, 我們將複製的值假設為n和m(n == x, m == y,但是&n != &x, &m != &y)意思就是值雖然相同 但是地址是不同的。
在函式中實際是對m和n的值進行呼叫, 改變了m和n的值, 但是退出函式時,這個值將會被銷燬, 因為他是儲存在棧上的,所以傳值呼叫不改變實際引數的值。
2:傳址呼叫:傳址就是將引數的地址傳給函式進行呼叫。還是用剛才的swap函式的例子。
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
int x = 1, y = 2;
swap(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
這個函式是將一個指向整型的指標當作引數傳遞,首先呼叫的時候還是會將引數進行復制,假設複製後的指標為p1和p2,(p1 == &x, p2 == &y),首先複製的指標的地址和實際引數的地址是相同的,然後再看函式,函式對指標進行間接引用,將指標所指向地址的值進行了改變,當退出函式時,p1和p2兩個變數還是會被銷燬,但是我們已經將這塊地址的值改變了,所以實際引數的值也會被改變,因為他們的地址是相同的。