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

C++ 參考與位址運算子 (&) 雙重身分深度解析

     編輯:關於C++

& 符號的雙重含義

C++ 中 & 有兩種截然不同的用途:

  1. 位址運算子:取得變數/物件的記憶體位址,賦值給指標。
  2. 參考宣告符:定義參考 (Reference),即變數別名。

1. 位址運算子用法

int a = 5;
int *p = &a;  // p 保存 a 的記憶體位址

2. 參考定義與特性

int a = 5;
int &b = a;  // b 是 a 的別名,兩者共用同一記憶體

驗證位址相同:

#include <iostream>
using namespace std;

int main() {
    int a = 5;
    int &b = a;
    cout << "&a = " << &a << endl;
    cout << "&b = " << &b << endl;  // 輸出相同位址
    return 0;
}

參考 vs 指標:核心差異

特性指標參考
語法int *p = &a;int &r = a;
存取值*pr (直接)
可重新綁定是否 (初始化後固定)
可為 null是否 (必須綁定有效物件)
記憶體開銷指標大小通常無額外開銷 (編譯器優化)
類別成員存取p->Member()r.Member()

實際範例:物件操作對比

class Human {
public:
    void Talk() { cout << "Hello" << endl; }
};

int main() {
    Human h;
    Human *p = &h;      // 指標
    Human &h1 = h;      // 參考

    p->Talk();          // 指標呼叫
    (*p).Talk();        // 解參考呼叫
    h1.Talk();          // 參考直接呼叫 (更簡潔)

    cout << "h 位址: "  << &h  << endl;
    cout << "p 位址: "  << p   << endl;
    cout << "h1 位址: " << &h1 << endl;  // 三者相同
}

參考的進階用法

函數參數:傳址呼叫的優雅寫法

void Swap(int &a, int &b) {  // 無需在呼叫端加 &
    int t = a; a = b; b = t;
}

函數回傳參考:左值回傳

int &GetElement(int *arr, int i) { return arr[i]; }
GetElement(arr, 3) = 10;  // 直接修改陣列元素

類別成員參考:必須在建構函數初始化列表綁定

class MyClass {
    int &m_Ref;
public:
    MyClass(int &var) : m_Ref(var) {}  // 僅此處可初始化
};

總結

  • & 前置於型別/變數名之間 → 參考宣告 (別名)
  • & 前置於單一變數前 → 取址運算子 (位址值)
  • 參考比指標更安全、語法更乾淨,適用於函數參數、回傳值、運算子多載;指標保留動態記憶體、可選擇性綁定、資料結構節點等低層控制場合。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved