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

C++ 指針與引用深度解析:從定義到底層實現

     編輯:關於C語言

標準定義視角 (ANSI C++ Standard)

  • 指針:T* 類型變量保存 T 對象地址,可加 const/volatile 限定符修飾指針本身
  • 引用:對象別名,主要用於函數參數/返回值,聲明形式 T&,cv-qualifier 僅通過 typedef/template 引入且被忽略

核心差異對比

特性指針引用
可為空是 (nullptr)否 (必須綁定有效對象)
可重新綁定是否 (初始化後不可改變指向)
sizeof 結果指針大小 (4/8 字節)所指對象大小
語法操作需 * 解引用、& 取址直接使用變量名,透明訪問
安全性有空指針、野指針風險無空引用、綁定後不可變,更安全

代碼驗證:引用不改變指向

int i = 10;
int& ref = i;
ref++;           // i 變 11
int j = 20;
ref = j;         // 賦值操作,非重新綁定!i 變 20,j 不變
ref++;           // i 變 21
// 輸出: i=21, ref=21, j=20

若為指針:ptr = &j 會改變指向,後續操作影響 j。

const 限定符深度解析

指針相關 (畫垂直線穿過 * 判斷)

  • const int* p / int const* p:常量指針,**指向常量**,不可通過 *p 修改值
  • int* const p:指針常量,**指針本身不可變**,需初始化,可通過 *p 修改值
  • const int* const p:常量指針常量,雙重限定

引用相關

  • const int& ref:引用常量,不可通過 ref 修改值
  • 不存在「引用常量」語法:引用本身天生不可重新綁定,等價於 int& const ref (非法語法)

底層實現:反彙編證明指針與引用同構

int i = 1;
int& ref = i;     // lea i地址 → eax; mov eax → ref存儲位置
int* p = &i;      // lea i地址 → eax; mov eax → p存儲位置

結論:編譯器層面,引用本質是指針常量 (指針本身不可變,自動解引用)。引用佔用內存空間 (存儲地址),「引用不佔內存」是謬誤。

參數傳遞機制差異

  • 指針傳遞:值傳遞 (傳地址值)。被調函數修改指針變量本身 (如 ptr = nullptr) 不影響主調函數
  • 引用傳遞:被調函數棧幀存儲實參地址,所有操作自動轉為間接訪問,**直接影響主調函數實參**

若需通過指針修改主調函數的指針變量,必須傳 指針的指針 (T**) 或 指針的引用 (T*&)。

最佳實踐指南

  1. **優先使用引用**:參數/返回值不為空、不需重新綁定時
  2. **必須用指針**:可為空、需重新綁定、需指針運算、C 接口兼容
  3. **const 正確性**:參數傳遞盡量加 const,明確只讀意圖
  4. **避免返回局部引用/指針**:生命週期結束導致懸空
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved