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

C 語言函數參數傳遞機制深度解析:值傳遞與指針實現交換

     編輯:程式設計疑難解答

問題背景

初學者常見困惑:`swap(x, y)` 函數內部交換了形參 `x`、`y` 的值,為什麼主函數中的實參 `a`、`b` 沒有變化?「單向傳遞」究竟如何運作?

核心原理:值傳遞

C 語言只有值傳遞。調用函數時,系統為形參分配臨時存儲空間,將實參的值的副本複製給形參。函數內部操作的是副本,不影響原始變量。

void swap(int x, int y) { // 形參 x, y 是實參 a, b 的副本
    int t = x;
    x = y;
    y = t;
    // 此處僅交換了副本的值
}

int main() {
    int a = 10, b = 20;
    swap(a, b); // 傳遞 a, b 的值 (10, 20)
    // a 仍為 10, b 仍為 20
}

為什麼需要 `t = x; x = y; y = t;` 三步驟?

這是經典的中間變量交換法:

  1. `t = x`:將 `x` 的值暫存到臨時變量 `t`(騰出 `x` 的位置)。
  2. `x = y`:將 `y` 的值賦給 `x`(完成 `x` 的更新)。
  3. `y = t`:將暫存的原 `x` 值(現存 `t` 中)賦給 `y`(完成 `y` 的更新)。

若直接寫 `x = y; y = x;`,第二步執行後 `x` 已變為 `y` 的值,原 `x` 值丟失,導致兩個變量值相同。

真正實現交換:傳遞地址(指針)

若需在函數內修改實參值,必須傳遞實參的地址,函數參數類型為指針。

void swap(int *px, int *py) { // 形參為指針,接收地址
    int t = *px; // 解引用獲取值
    *px = *py;   // 通過地址修改原變量
    *py = t;
}

int main() {
    int a = 10, b = 20;
    swap(&a, &b); // 傳遞地址
    // a=20, b=10 交換成功
}

內存模型圖解

調用 swap(&a, &b) 時:
棧幀 main:  a [地址 0x100, 值 10]   b [地址 0x104, 值 20]
棧幀 swap:  px [地址 0x200, 值 0x100]  py [地址 0x204, 值 0x104]
             ↑                              ↑
             └────────── 指向 ─────────────┘
*px 解引用訪問 0x100 處內存,直接修改 a 的值。

總結

  • C 語言參數傳遞本質是值拷貝。
  • 「單向傳遞」指數據流向:實參值 → 形參副本,無反向流動。
  • 需修改實參時,傳遞指針(地址),在函數內通過解引用操作原內存。
  • 交換算法三步驟(暫存、賦值、恢復)是通用邏輯,與語言無關。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved