int func(int x) {
int y = 13;
x = x + y;
return x;
}
int main() {
int x = 3;
func(x);
printf("%d", x + x); // 輸出 6,非預期 16
}
C 語言**只有值傳遞**。func(x) 將主調函數 x 的**值(3)複製**給被調函數的**形式參數 x**(另一個變量)。被調函數修改的是副本,主調函數的原變量**完全不受影響**。
main 棧幀: func 棧幀:
+-------+ +-------+
| x = 3 | ───值複製──▶ | x = 3 | (形參,獨立地址)
+-------+ +-------+
| y = 13|
+-------+
x = x+y → x=16 (局部修改)
return 16
main 棧帧 x 依然為 3
printf("%d", x + x) 使用的是 **main 中的 x(值 3)**,所以 3+3=6。func(x) 的返回值 16 被丟棄了(未賦值給變量)。
int main() {
int x = 3;
int result = func(x); // 接收返回值
printf("%d", result + x); // 16 + 3 = 19
// 或
x = func(x); // 用返回值覆蓋原變量
printf("%d", x + x); // 16 + 16 = 32
}
void func_ptr(int *px) { // 接收地址
*px = *px + 13; // 解引用修改原內存
}
int main() {
int x = 3;
func_ptr(&x); // 傳遞地址
printf("%d", x + x); // 16 + 16 = 32
}
搞清「值傳遞」與「指針傳遞」的本質區別,是 C 語言從入門到精通的分水嶺。