引數按值傳遞

在 C 中,所有函式引數都是按值傳遞的,因此修改 callee 函式中傳遞的內容不會影響呼叫函式的區域性變數。

#include <stdio.h>

void modify(int v) {
    printf("modify 1: %d\n", v); /* 0 is printed */
    v = 42;
    printf("modify 2: %d\n", v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(v);
    printf("main 2: %d\n", v); /* 0 is printed, not 42 */
    return 0;
}

你可以使用指標讓 callee 函式修改呼叫函式的區域性變數。請注意,這不是通過引用傳遞,而是傳遞指向區域性變數的指標

#include <stdio.h>

void modify(int* v) {
    printf("modify 1: %d\n", *v); /* 0 is printed */
    *v = 42;
    printf("modify 2: %d\n", *v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(&v);
    printf("main 2: %d\n", v); /* 42 is printed */
    return 0;
}

但是,將區域性變數的地址返回給被呼叫者會導致未定義的行為。請參閱取消引用指向變數超出其生命週期的指標