int a[5], *p = &a[0]; 等價於 p = a;(數組名 = 首地址)。
定義時初始化:int *p = a; 或 int *p = &a[0];
p = &a[1]; *p = 10; ⇔ a[1] = 10;p + 1 指向下一元素。結論:指針 + n ≡ p + n × sizeof(type)p+i、a+i 均為 &a[i];*(p+i)、*(a+i) 均為 a[i]
// 1. 指針變量
for (int i=0; i<5; i++) printf("%p:%d ", p+i, *(p+i));
// 2. 數組名
for (int i=0; i<5; i++) printf("%p:%d ", a+i, *(a+i));
// 3. 指針自增(推薦風格)
for (int *p = a; p < a+5; p++) printf("%p:%d ", p, *p);
輸出地址遞增 4(int 4 字節),值 1~5。

數組名是常量,不能做 ++/--/賦值!
優先下標法:效率不低於指針法,可讀性強。

兩地址相減結果除以 sizeof(type),得元素個數差(圖中結果為 1,非 4)。

&a[5] - &a[0] = 5。僅供理解內存佈局,實際代碼請用 sizeof(a)/sizeof(a[0])。

字符串字面量存只讀區,嘗試修改報錯。
破解:二進制編輯器修改 PE 標誌 0x40 (只讀) → 0xC0 (讀寫)。


運行成功:szMsg:HelLo, pszMsg:HelLo / szMsg:6, pszMsg:4。
原理:0x40 = 可讀不可寫,0xC0 = 可讀可寫。僅供實驗,生產嚴禁!