初學者常見程式碼:
char s[80], *p = s;
while (*(p + i) != '\0') {
*(p + i) = toupper(*(p + i));
i++;
}
*(p + i) 究竟做了什麼?
s 首元素地址(即 &s[0])。i * sizeof(*p) 位元組。因 p 是 char*,sizeof(char) == 1,故地址直接 +i。p[i] 或 s[i]。因此,*(p + i) 代表陣列第 i 個元素(從 0 計數)。
原回答補充提到:
指針+1,具體偏移多遠,和指針類型有關。
char*+1 偏移 1 位元組。
int*+1 偏移sizeof(int)位元組(通常 4)。
修正:原文稱 char 偏移 8 位元組、int 偏移 32 位元組錯誤。正確為位元組單位,非位元。32 位系統下 int 通常 4 位元組(32 位元),64 位系統同理。
| 寫法 | 含義 |
|---|---|
s[i] | 陣列下標訪問(最直觀) |
*(s + i) | 指針算術 + 解引用 |
*(p + i) | 指針變量算術 + 解引用 |
p[i] | 指針當陣列用(C 語言核心特性) |
s[i] 或 p[i],可讀性最強。*(p+i) 本質,便於閱讀底層庫源碼、嵌入式代碼。