参数按值传递
在 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;
}
但是,将局部变量的地址返回给被调用者会导致未定义的行为。请参阅取消引用指向变量超出其生命周期的指针 。