int find(int *a); int b = 1; int test = find(&b); // 實際執行:int *a = &b
創建新指標變數 a,指向 b。函數內修改 *a 影響外部 b。
int find(int &a); int b = 1; int n = find(b); // 實際執行:int &a = b
a 成為 b 的別名,無新變數創建,直接操作原變數。
int find(int a); int b = 1; int n = find(b); // 實際執行:int a = b
創建副本 a,函數內修改不影響外部 b。
int a = 0; int *p = &a; // p 存儲 a 的地址 int val = *p; // val 獲取 a 的值(0)
int a = 0; // 假設地址 0x0012ff60 int *p = &*(int*)0x0012ff60;
解析:
(int*)0x0012ff60:將整數轉為 int 指標*...:解引用,獲取該地址的值(即 a 的值)&...:再次取址,此處 & 非取址運算,而是「脫去解引用」,還原為 (int*)&a關鍵結論:& 作為取址運算,操作數必須是變數/函數標識符。表達式結果(如 *ptr)無地址,此時 & 表示類型轉換中的「去引用」。
int *p = &*&*&a; // 等價於 int *p = &a;
每對 &* 相互抵消,最終回歸取址本質。
| 錯誤代碼 | 原因 | 正確寫法 |
|---|---|---|
int *p = &0x01000; | 字面常數無地址 | int *p = (int*)0x01000; |
int *p = &(*ptr); | *ptr 非標識符,& 非取址 | 直接用 ptr |
scanf("%d", a); | 缺少 &,傳值而非傳址 | scanf("%d", &a); |
int a = 0; int &r = a; // r 是 a 的別名 cout << r; // 輸出 0
引用必須初始化,綁定後不可改變指向,本質是編譯器層面的別名機制,無額外記憶體開銷。
a & b 位運算(運行期計算)int &r = a 類型修飾符區分上下文,精準理解,是寫出正確 C/C++ 代碼的基石。