引數按值傳遞
在 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;
}
但是,將區域性變數的地址返回給被呼叫者會導致未定義的行為。請參閱取消引用指向變數超出其生命週期的指標 。