首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言函數參數傳值:為什麼 func(x) 不改變 main 中的 x?

     編輯:程式設計綜合問答

代碼

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

為什麼輸出 6?

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 語言**參數傳遞永遠是值拷貝**;數組名傳遞是「首元素地址的值拷貝」,可修改元素但不可修改數組指針本身。
  • 函數返回值是**唯一**將計算結果帶回主調函數的標準途徑。
  • 需修改主調變量時,傳遞**指針**(地址),在函數內解引用操作。

搞清「值傳遞」與「指針傳遞」的本質區別,是 C 語言從入門到精通的分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved