【C語言入門】155.指標與函式呼叫

呼叫函式時,作為引數的變數會被複製一份到函式內成為參數。在被呼叫的函式內對參數做任何的變數都不會改變到原本的變數。

#include <stdio.h>

void addone(int n){
    n = n+1;
}

int main()
{
    int a =3;
    addone(a);
    printf("%d", a);

    return 0;
}

輸出結果:3

呼叫 addone 的時候,會把 3 複製一份到 addone function。

對函式 addone 來說他只是得到一個 int 的複製品,無法知道該整數「原本」存放的地方或來源。

a 在 main 裡宣告或定義,只有在 main 可以被用到。

我們在呼叫 addone 的時候,我們會給 addone function 一個複製,由於是複製,所以沒辦法改到 a 的值。

但是指標的特性不一樣,如果我們得到一個記憶體位址,我們對記憶體裡存的變數可以做值的修改。

不過如果複製的是 a 的記憶體位址,如下,結果就不一樣了。

#include <stdio.h>

void addone(int *n){
    *n = *n+1;
}

int main()
{
    int a =3;
    addone(&a);
    printf("%d", a);

    return 0;
}

輸出結果:4

addone 函式中的 n 一定要加 * 才會獲得記憶體位址。

addone function 對記憶體位址的址做修改,是真的會改到變數。

*n = *n+1;

n 是 a 的位址,再加 *,就是值。

*n+1 中的 *n 是做讀值的動作,最前面的 *n 是做修改值的動作。

如果是複製值,我們沒辦法對本尊做變動;如果是複製位址,我們能夠把原本位址的值改掉。

Leave a Comment

Your email address will not be published. Required fields are marked *