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

C++ 參數傳遞:引用 vs 指針在 swap 函數中的本質區別

     編輯:關於C語言

代碼對比

引用版(正確交換)


void swap(char &a, char &b) {
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

指針版(錯誤:交換的是局部指針變量)


void swap(char *a, char *b) {  // 參數是指針的副本
    a = a ^ b;  // 錯誤:指針地址異或,非解引用
    b = a ^ b;
    a = a ^ b;
}

指針版正確寫法


void swap(char *a, char *b) {
    *a = *a ^ *b;  // 解引用操作數值
    *b = *a ^ *b;
    *a = *a ^ *b;
}
// 調用:swap(&x, &y);

核心區別深度解析

特性引用 (T&)指針 (T*)
初始化定義時必須綁定對象,不可為空可為 nullptr,可延遲綁定
重綁定不可,永遠指向初始對象可隨時指向新地址
賦值語義修改被引用對象的值修改指針變量本身的地址值
語法糖自動解引用,使用如普通變量需顯式 * / -> 解引用
參數傳遞調用方無感知,像值傳遞調用方需取地址 &

經典錯誤演示


int x = 10, y = 20;
int *p = &x, *q = &y;

p = q;        // p 指向 y,x 不變
*p = *q;      // x 變為 20,y 不變

int &r = x, &s = y;
r = s;        // x 變為 20,r 仍綁定 x
// 無法讓 r 綁定 y

最佳實踐建議

  1. 優先用引用:語義清晰(輸入/輸出參數)、無空指針風險、調用語法簡潔
  2. 必須用指針時:可為空、需重新綁定、C 接口兼容、數組衰減
  3. const 引用:大對象只讀傳遞,避免拷貝,void func(const BigObj &obj)
  4. 避免指針運算邏輯錯誤:牢記 p = q 改變指向,*p = *q 改變值

引用是 C++ 引入的「別名機制」,本質是編譯器層面的自動解引用指針,但語義限制更嚴格,能防止大類指針誤用。理解兩者在參數傳遞中的異同,是寫出正確、安全 C++ 代碼的基礎。

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