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

C/C++ 函數參數傳遞三大模式深度對比:值傳遞、指針傳遞、引用傳遞

     編輯:關於C語言

三種模式代碼對比

// 1. 值傳遞
void Exchg1(int x, int y) {
    int tmp = x; x = y; y = tmp;
    printf("函數內 x=%d, y=%d\n", x, y);
}

// 2. 指針傳遞(地址傳遞)
void Exchg2(int *px, int *py) {
    int tmp = *px; *px = *py; *py = tmp;
    printf("函數內 *px=%d, *py=%d\n", *px, *py);
}

// 3. 引用傳遞
void Exchg3(int &x, int &y) {
    int tmp = x; x = y; y = tmp;
    printf("函數內 x=%d, y=%d\n", x, y);
}

調用與效果

int main() {
    int a = 4, b = 6;
    
    // Exchg1(a, b);  // a=4, b=6 不變
    // Exchg2(&a, &b); // a=6, b=4 交換成功
    Exchg3(a, b);     // a=6, b=4 交換成功
    
    printf("main 內 a=%d, b=%d\n", a, b);
    return 0;
}

本質剖析

模式定義語法調用語法函數內操作對象能否修改實參
值傳遞void f(int x)f(a)副本 x否
指針傳遞void f(int *px)f(&a)實參地址指向的內存 *px是
引用傳遞void f(int &x)f(a)實參本身(別名)是

核心差異圖解

  • 值傳遞:實參 → 複製 → 形參(獨立內存),函數操作形參,實參無感
  • 指針傳遞:實參地址 → 複製 → 形參指針,函數通過解引用操作實參內存
  • 引用傳遞:實參 → 別名綁定 → 形參,形參就是實參,無額外內存(編譯器層面實現)

統一本質

所有參數傳遞本質上都是「將實參的值複製給形參」。值傳遞複製變量值,指針傳遞複製地址值,引用傳遞在編譯器層面建立別名綁定。

選擇指南

場景推薦理由
輸入參數,不需修改,類型較小值傳遞簡單、安全、無副作用
輸入參數,不需修改,類型較大const 引用避免拷貝開銷,語義清晰
輸出參數,需修改實參引用 / 指針引用語法更簡潔,指針可為 NULL 表可選
C 語言環境指針C 無引用機制
需表達「可選輸出」指針傳 NULL 表示不需要該輸出

常見誤區

  1. 以為引用傳遞沒有拷貝開銷 → 實際編譯器多用指針實現,有指針大小的傳遞開銷
  2. 指針傳遞時忘記取地址 & 或解引用 *
  3. 值傳遞大結構體導致棧溢出或效能低下

總結

理解三種模式的本質區別在於「函數內操作的是副本、地址指向的內存、還是別名綁定的原變量」。C++ 推薦優先使用引用(含 const 引用),C 僅能用指針,現代 C++ 更提倡值語義與移動語義減少顯式指針/引用使用。

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