const int i = 10;
int j;
int *p = &j;
p++;
*p = 20;
j = i;
cout << p << \" \" << *p << endl; // 0012FF44 20
cout << &i << \" \" << i << endl; // 0012FF44 10
cout << &j << \" \" << j << endl; // 0012FF40 10
輸出顯示 p 與 &i 位址相同(0012FF44),但 *p=20、i=10 值不同。
p++ 使指標超出 j 的合法範圍,隨後寫入 *p=20 屬於**越界寫入**,行為不可預期。const int i=10 讓編譯器將 i 視為編譯期常數,直接內嵌 10 到機器碼,**不讀取記憶體**。即使記憶體被改寫,cout<<i 仍輸出 10。i 與 j 相鄰,p++ 剛好落在 i 的位址,但這**不具可移植性**,換編譯器/優化等級位址關係即改變。const int xyz = 3333;
const int i = 123;
int j = 321;
int *p = &j;
p++; *p = 13; // 嘗試修改 i 位址
cout << p << *p << endl; // 印出 3333 (xyz) 而非 13
cout << &i << i << endl; // 仍印 123
顯示編譯器將 i 視為唯讀常數區,**實際寫入的是鄰近的另一常數 xyz**,且 i 的值因常數傳播未變。
constexpr 或 const 但**不嘗試透過指標修改**。const 物件做 const_cast 後寫入,除非確知原物件非真正常數(如硬體暫存器映射)。結論:**同一位址兩值**是 UB + 編譯器常數傳播 + 棧佈局巧合共同造就的假象,不可依賴、不可複製。