今天學習了一下C++中的強制轉換,看了const_cast,我發現了這個轉換關鍵字的奇怪之處,于是把它記錄一下,廢話不說,先看一個程式:
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 const int val = 5;
8 int test =5;
9 //int *pval = &val; //err: cannot convert from 'const int * to int *'
10 int *pval = const_cast<int *>(&val);
11 cout << "Before:" << endl;
12 cout << " val:" << val << endl;
13 cout << "*pval:" << *pval << endl;
14 *pval = 10;
15 cout << "After:" << endl;
16 cout << " val:" << val << endl;
17 cout << "*pval:" << *pval << endl;
18 return 0;
19 }
以上程式列印的結果:
一開始 *pval 和val的值都是5,因為他們指向同一位址。
但是後來我通過給(*pval)指派,是的指針pval所指向的記憶體位址為10,然後列印去而發現val 還是等于 5 而*pval卻等于10,這是很沖突的啊,按理講他們是記憶體中同一塊位址中的内容,應該完全一樣啊,我很不解,于是我看了一下記憶體:
以上圖中的位址就是val的記憶體位址,但是通過上面的圖可以看到,0012FF44位址處的值為 0000000A(16進制,4個位元組) = 10 (十進制)。
也就是說記憶體中的内容确實被改變了,隻是編譯器在輸出const int val時并不是讀取記憶體位址内容!為了搞懂這個問題我又彙編了一下:
發現在輸出val值得過程中,編譯器直接将5指派給val,而不是工記憶體中讀取。這就解釋了為什麼指向記憶體中同一個位址,輸出的值卻不同!
轉載于:https://www.cnblogs.com/zhuwbox/p/3383188.html