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

C語言函數參數傳遞:傳值與傳址深度解析

     編輯:關於C語言

核心概念

  • 形參:函數定義中的參數,僅在函數內部可見。
  • 實參:函數調用時傳入的實際變量/表達式。
  • 傳值:實參值的副本傳給形參,函數內修改不影響實參。
  • 傳址:傳遞實參地址(指針),函數可通過解引用修改實參。

案例 1:傳值參數(無法修改實參)

int inc(int x) { x++; return x; }

int main() {
    int num = 1;
    printf("%d\n", inc(num)); // 輸出 2
    printf("%d\n", num);      // 輸出 1,num 未變
    return 0;
}

調用時隱含執行 int x = num;,操作的是副本。

案例 2:傳址參數(可修改實參)

int inc(int *p) { *p = *p + 1; return *p; }

int main() {
    int num = 1;
    printf("%d\n", inc(&num)); // 輸出 2
    printf("%d\n", num);       // 輸出 2,num 已被修改
    return 0;
}

傳遞 &num,函數內 *p 直接操作原內存。

案例 3:傳址但不修改實參

int inc(int *p) { return *p + 1; } // 僅讀取,未賦值

int main() {
    int num = 1;
    printf("%d\n", inc(&num)); // 輸出 2
    printf("%d\n", num);       // 輸出 1,未變
    return 0;
}

傳址不代表一定修改,關鍵在於函數體是否對 *p 賦值。

案例 4:形參與實參對照

int sum(int x, int y) { return x + y; } // x, y 為形參

int main() {
    int i = 11;
    i = sum(i, 22); // i, 22 為實參
    printf("%d\n", i); // 33
    return 0;
}

進階:模擬傳引用(C++ 引用 / C 指針)

C 無原生引用,但傳址實現相同語義。C++ 引用 void swap(int &a, int &b) 語法更簡潔,本質仍是指針操作。

總結對照表

傳遞方式語法能否修改實參典型用途
傳值func(int x)否只讀輸入、小型結構體
傳址func(int *p)是需修改實參、大型結構體、輸出參數
傳引用func(int &x) (C++)是C++ 首選,語法清晰

避坑指南

  • 數組名作實參自動退化為指針,實為傳址,函數內可修改數組內容。
  • 指針作實參時,傳的是指針值的副本;若需修改指針本身(如分配內存),需傳二級指針 **p。
  • 嚴禁返回局部變量/指針的地址(懸垂指針)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved