近期專案中發現團隊成員對 C/C++ 指標與參考的區別模糊不清。隨著 Java、C# 等高階語言普及,開發者與作業系統底層的距離拉大,導致指標這一 C/C++ 核心機制被邊緣化甚至遺忘。本文系統梳理三種參數傳遞機制,並跨語言對比其設計哲學。
// 主程式
CString strUserId = "001";
CString strUserName = "無名";
BOOL bFind = FindUserName(strUserId, strUserName);
CString&(推薦用於輸出參數)BOOL FindUserName(CString& strUserIdParam, CString& strUserNameParam) {
if (strUserIdParam == "001") {
strUserNameParam = "王澤賓"; // 修改實參物件
return TRUE;
}
return FALSE;
}
// 結果:彈出 "User Name:王澤賓"
strUserNameParam 是 strUserName 的別名,類似 Windows 捷徑或 Linux 符號連結CString(預設行為)BOOL FindUserName(CString strUserIdParam, CString strUserNameParam) {
if (strUserIdParam == "001") {
strUserNameParam = "王澤賓"; // 修改副本
return TRUE;
}
return FALSE;
}
// 結果:彈出 "User Name:無名"(原物件未變)
CString*(C 風格,輸出參數替代方案)BOOL FindUserName(CString* pstrUserIdParam, CString* pstrUserNameParam) {
if (*pstrUserIdParam == "001") {
*pstrUserNameParam = "王澤賓";
return TRUE;
}
return FALSE;
}
// 呼叫:FindUserName(&strUserId, &strUserName);
// 結果:彈出 "User Name:王澤賓"
*,語法較繁瑣nullptr 表示「無輸出」| 特性 | 指標 | 參考 |
|---|---|---|
| 可為 null | 是 | 否(宣告必須初始化) |
| 可重新繫結 | 隨時修改指向 | 初始化後不可變更 |
| 語法操作 | *p, p-> | 直接使用變數名 |
| 編譯期實體 | 獨立變數(佔記憶體) | 別名(編譯後等同指標) |
| 安全性 | 野指標、懸空指標風險 | 語法層面消除空參考風險 |
int i = 5, j = 6;
int& k = i; // k 繫結 i
k = j; // 僅賦值,k 仍繫結 i,i 變為 6
// k 無法變成 j 的參考
「參考實際上只是編程語言中語法層面的概念,經編譯後實際執行的代碼中與指標沒有任何區別。」
引入參考帶來雙重紅利:
&,被呼叫端無 *class ObjUser { String strName = "init value"; }
public class Test {
ObjUser user = new ObjUser();
int age = 60;
void changeObj(ObjUser u) { u.strName = "changed value"; }
void changeInt(int a) { a = 80; }
public static void main(String[] args) {
Test t = new Test();
System.out.println("Before changeObj: " + t.user.strName); // init value
t.changeObj(t.user);
System.out.println("After changeObj: " + t.user.strName); // changed value
System.out.println("Before changeInt: " + t.age); // 60
t.changeInt(t.age);
System.out.println("After changeInt: " + t.age); // 60
}
}
結果證明:物件傳參考(可修改內部狀態),基本型別傳值(不可修改)。
Java 使用 clone() 深層複製後再傳遞;C# 結構體(struct)屬值型別,預設傳值;PHP 保留 & 明確指定傳參考。
const T&,輸出參數用 T& 或 T*,所有權轉移用智慧指標本文出自 “網站架構之家” 博客,請務必保留此出處 https://wangzebin.blog.51cto.com/653300/182452