1. 程式人生 > >函式的傳值和傳址呼叫(C語言)

函式的傳值和傳址呼叫(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兩個變數還是會被銷燬,但是我們已經將這塊地址的值改變了,所以實際引數的值也會被改變,因為他們的地址是相同的。