理解變數和常數的記憶體位址行為
在涉及const 變數和指向它的指標的程式碼指向它的指標的程式碼中,觀察到不同的片段同一記憶體位址處的值會引發問題。
#include <iostream> using namespace std; int main() { const int N = 22; int * pN = const_cast<int*>(&N); *pN = 33; cout << N << '\t' << &N << endl; cout << *pN << '\t' << pN << endl; }
22 0x22ff74 33 0x22ff74
我們為什麼觀察同一記憶體位址處的兩個不同值(22 和33) (0x22ff74)?
與觀察相反,同一記憶體位址不存在兩個不同的值。這是編譯器最佳化的結果。
編譯器有權將任何提及 const 變數的行為視為直接使用該變數的編譯時值。在此程式碼中,編譯器將程式碼視為:
int * pN = const_cast<int*>(&22); *pN = 33;
編譯器有權套用此最佳化。但是,需要注意的是,編譯器並不限於此操作。它可能會採用其他最佳化,包括如果您進行修改與 const 變數相關的記憶體等危險行為,則可能會刪除硬碟上的資料。
以上是為什麼修改`const`變數的記憶體位址顯示不同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!