参数按值传递

在 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;
}

但是,将局部变量的地址返回给被调用者会导致未定义的行为。请参阅取消引用指向变量超出其生命周期的指针