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

C語言函數參數傳遞機制深度解析:值傳遞與變量作用域

     編輯:C 語言問答

C語言函數參數傳遞:為什麼 x、y 不會變?

經典困惑代碼:

int max(int x, int y) {
    int z = (x > y) ? x : y;
    return z;
}

int main() {
    int a = 2, b = 3;
    int c = max(a, b);  // c=3
    // 問:x、y 是多少?a、b 變了嗎?
}

核心結論:C 語言只有「值傳遞」

  • 調用 max(a, b) 時,實參 a、b 的值被複製 給形參 x、y。
  • 函數內修改 x、y絕不影響 main 中的 a、b。
  • 形參 x、y 是函數內部的局部變量,函數返回即銷毀。

逐題解析

  1. c=max(a,b), a=2,b=3 → 形參 x=2, y=3,返回 z=3,c=3。a、b 不變。
  2. a=2,b=3, x=10,y=15 → 這裡 x、y 是 main 的局部變量,與 max 的形參無任何關係。max 內部 x、y 仍為 2、3。main 的 x、y 保持 10、15。
  3. a,b 未賦值, x=10,y=15 → a、b 為未初始化局部變量,值不確定(垃圾值)。max 接收垃圾值,行為未定義。x、y 仍為 10、15。
  4. c 等於誰? → c = max函數返回值 = z(即 x、y 中較大者)。

如何實現「修改實參」?—— 指針傳遞模擬引用

void swap(int *a, int *b) {  // 傳遞地址
    int t = *a; *a = *b; *b = t;
}

int main() {
    int x = 10, y = 20;
    swap(&x, &y);  // 傳遞變量地址
    // 此時 x=20, y=10
}

本質仍是值傳遞(傳遞指針值),但通過解引用 *ptr 可修改原變量。

作用域與生命週期總結

變量類型作用域生命週期示例
函數形參函數內部函數調用期間max(int x, int y) 中的 x,y
函數局部變量塊內({})塊執行期間int z 在 max 內
主函數局部變量main 內部程序運行全程int a,b 在 main 內

避坑指南

  • 永遠不要期望函數直接修改傳入的基本類型變量(int, float, char 等)。
  • 需修改時,傳遞指針(或 C++ 參考)。
  • 陣列名作參數時退化為指針,函數內可修改陣列內容(這是指針傳遞的特例)。
  • 開啟編譯器警告(-Wall -Wextra / /W4),捕獲未初始化變量使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved