& 取地址運算符核心用法
基本語義
- 一元運算符,作用於**左值** (變量、陣列元素、解引用指針、結構體成員)
- 返回操作數在內存中的**地址** (類型為指向該類型的指針)
&a 類型為 int* (若 a 為 int)
scanf 必須用 & 的原因
int a, b;
scanf("%d %d", &a, &b); // 正確
// scanf("%d %d", a, b); // 錯誤:傳遞值而非地址,scanf 無法修改原變量
scanf 需要修改調用者的變量,C 語言只有值傳遞,必須傳遞地址讓 scanf 通過指針間接寫入內存。
核心應用場景
| 場景 | 代碼示例 | 說明 |
| 指針初始化 | int *p = &a; | p 指向 a 的地址 |
| 函數修改實參 | void swap(int *a, int *b) | 調用 swap(&x, &y) |
| 動態分配返回 | p = malloc(...) | malloc 返回地址,無需 & |
| 陣列名特例 | int a[10]; &a[0] == a | 陣列名退化為首元素地址 |
| 結構體成員 | &s.field | 取成員地址 |
常見錯誤
& 用於常量/字面值/表達式:&10、&(a+b)、&func() — **非左值,編譯錯誤**
scanf("%d", a) 忘記 & — 運行時崩潰 (段錯誤) 或寫入錯誤地址
- 指針變量再取址:
&p 類型為 int**,層級加深,需明確意圖
對應運算符:* 解引用
*p 訪問 p 指向的內存單元
& 和 * 互為逆操作:*&a == a、&*p == p (p 合法時)
- 上一篇文章: C語言右移運算符>>詳解:位運算、算術右移、除2優化
- 下一篇文章: C語言水仙花數:三位數自冪和判斷算法實現
Copyright ©
程式碼之家 All Rights Reserved