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

C++ 符號 & 雙重身份解析:取址運算子 vs 參考宣告

     編輯:VC 教學

一符號,兩世界

在 C++ 中,& 同時扮演兩種截然不同的角色:

  1. 取址運算子:int* p = &a; 取得變數記憶體位址
  2. 參考宣告子:int& r = a; 為變數建立別名

編譯器依據**上下文**(型別宣告 vs 運算式)自動區分。

取址運算子:指標的基石

int a = 5;
int* p = &a;        // p 保存 a 的位址
std::cout << p;     // 輸出位址(如 0x7ffc1234)
std::cout << *p;    // 解參考,輸出 5
  • 適用於任何左值(變數、陣列元素、物件成員)
  • 結果型別為 T*(指向原型別的指標)
  • 不可用於暫時物件、字面常數、位欄

參考:變數的別名

int a = 5;
int& r = a;         // r 是 a 的別名,非新變數
r = 10;             // a 變為 10
std::cout << &a << " " << &r; // 輸出相同位址

參考特性

  • 初始化即綁定,不可重新綁定(int& r2 = b; 是初始化 r2,非讓 r 指向 b)
  • 無記憶體開銷:編譯器內部實現為指標,但語法層面如同原變數
  • 必須初始化:int& r; 編譯錯誤
  • 不可為 void、陣列、位欄建立參考

經典陷阱:函數參數傳遞

方式語法效果典型用途
傳值void f(int x)複製副本,原變數不變小型 POD、需修改副本
指標void f(int* p)傳遞位址,可修改原值,可為 nullptrC 風格、選擇性輸出、陣列
參考void f(int& r)別名,必須綁定左值,不可為 null,語法乾淨**首選**:修改原值、避免大型物件複製
常數參考void f(const int& r)唯讀別名,可綁定暫時物件/字面值**首選**:大型物件唯讀傳遞

實戰範例:交換函數

// 指標版
void SwapPtr(int* a, int* b) { int t=*a; *a=*b; *b=t; }

// 參考版(推薦)
void SwapRef(int& a, int& b) { int t=a; a=b; b=t; }

int x=1, y=2;
SwapRef(x, y); // 呼叫簡潔,無需 &

進階:參考摺疊與通用參考

template
void Forward(T&& param) { // T&& 是通用參考(非右值參考)
    // param 保持原值類別:左值→T&,右值→T&&
    Process(std::forward(param));
}

此為 C++11 完美轉發核心,&& 在模板型別推導中觸發參考摺疊規則。

總結

  • & 在**型別宣告**中 = 參考宣告子(別名)
  • & 在**運算式**中 = 取址運算子(位址)
  • 參考是「語法糖衣下的指標」:**更安全(無空值)、更乾淨(無解參考)、更高效(編譯器優化同指標)**
  • 現代 C++ 原則:**參數傳遞優先用 const 參考,需修改用非 const 參考,避免指標**
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved