main() {
char *p1 = "stuents", *p2;
long int *p3;
p3 = (long*)p1;
p3++;
p2 = (char*)p3;
printf("%s\n", p2);
}
輸出結果為 nts。初學者常困惑於 p3 = (long*)p1 這類指標轉換的含義,本文將從記憶體模型角度詳細拆解。
字串 "stuents" 在記憶體中連續儲存(含結尾 \0):
| 位址偏移 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 字元 | s | t | u | e | n | t | s | \0 |
| p1 指向 | ▼ |
p3 = (long*)p1:將 char* 強制轉型為 long*。p3 現在指向字串起始位址,但編譯器視其為指向 long 型資料(通常 4 或 8 位元組,視架構而定,此處假設 32 位系統為 4 位元組)。p3++:指標遞增。對 long* 而言,++ 會增加 sizeof(long) 位元組(4 位元組)。p3 從偏移 0 移至偏移 4,指向字元 'n'。p2 = (char*)p3:轉回 char*,p2 指向偏移 4 位置的 'n'。printf("%s", p2):從 p2 起印出字串,輸出 nts。整段程式等價於:
p2 = p1 + 4; // 直接以 char* 偏移 4 字元
printf("%s", p2);
char* 步長 1 位元組,long* 步長 sizeof(long) 位元組。char 陣列,%s 從指標位置讀取直到遇到 \0。避坑提醒:隨意在不同類型指標間轉換並解參考,可能違反嚴格別名規則,導致未定義行為。教學範例僅為展示指標運算原理,實務開發應避免此類寫法。