#include<iostream>
#include<iomanip>
using namespace std;
int main() {
int a = 0;
const int& b = a;
cout << a << setw(10) << &a << endl;
cout << b << setw(10) << &b << endl;
a = 1;//給a賦值;
cout << a << setw(10) << &a << endl;
cout << b << setw(10) << &b << endl;
b = 1; //運算式必須是可修改的左值
cout << a << setw(10) << &a << endl;
cout << b << setw(10) << &b << endl;
system("pause");
return 0;
}

對此我作為一個新手表示疑惑,b作為a的參考別名,只想同一個記憶體地址00D9FC84,為什么可以通過a改變此記憶體地址中存放的資料值,然而b作為a的const別名,卻無法改變此記憶體地址的存放資料值 對此我個人猜想了幾個問題所在點:
1. 變數名和其對應記憶體地址的關系我完全弄明白。。。。。。。
2. 一個記憶體是否只讀CONST是可以改變的。。。。。。。。。
新手發帖,多加指教!
uj5u.com熱心網友回復:
C++ primer 第五版 56頁對const的參考可能參考一個并非const的物件
必須認識到,常量參考僅對參考可參與的操作做出了限定,對參考的物件本身是不是一個常量并未作限定。因為物件也可能是個非常量,所以允許通過其他非CONST&途徑改變它的值
意思就像我上面的問題一樣,可以通過a改變那個記憶體地址中的資料值,不允許通過b
對此我個人自己找到這個答案,然而我更加疑惑了CONST到底是什么意思,這就是C++的所謂的坑嗎?好深啊。。。。。
uj5u.com熱心網友回復:
你的程式并不是在直接訪問你的記憶體。你的程式通過編譯器編譯成機器語言,真正訪問記憶體的是這些機器語言指令。
甚至你所認為的訪問“記憶體”(這里用引號,是因為C++語言語意里的記憶體和真實記憶體并不一樣,這里指前者)的陳述句,經過編譯器的翻譯,在機器語言里可能對應看上去完全不相關的指令。
const是C++語言層面上的限制,不是訪問記憶體層面的限制。
uj5u.com熱心網友回復:
樓上說的有點道理。學習C++,最主要的就是認識到你寫的const、int等 都只是編譯器的一種標志,而不是實際上的記憶體空間。當你加上const之后,就是告訴編譯器不允許修改這個變數的值。所以雖然b就是a的別名,但是你告訴了編譯器這個別名是不可修改的,所以就在編譯時不允許你去對這個別名進行賦值。uj5u.com熱心網友回復:
不要糾結各種常量了,這個世界上唯一不變的就是變化。用API WriteProcessMemory還能修改正運行的其它行程的記憶體里面的所謂常量呢!uj5u.com熱心網友回復:
const限定符的意義是“不允許對這個符號進行再次賦值”,而不是“保證這塊記憶體的值不變”編譯器只會管你有沒有對const修飾的符號進行修改,至于實際記憶體發生了什么,它不管也不會知道
這個限定符的主要作用就是告知編程人員,這是個不能改的量,防止程式員手滑改了不能動的東西
這不是坑,本來就是這么用的
uj5u.com熱心網友回復:
const 限定是 b, b 是對 a 的一個只讀參考. 也就是說通過 b 只能讀取 a的資料, 而不修改它. 并沒有改變a 本身的屬性. 這只是從語法和主義上來規范我們的編程行為, 至于其他技術手段訪問記憶體的, 不在此范圍內!
uj5u.com熱心網友回復:
const的作用就是不可改變,當然:const int 此型別定義的變數的記憶體地址是不可改變的,但是記憶體中所存的值是可以發生改變的。uj5u.com熱心網友回復:
const 作用是在編譯期間的.uj5u.com熱心網友回復:
const T 非常有意思。例如大家都認為,const 變數會存盤在常量區。這個說法不完全正確,當你的程式絕不會對const 變數取地址的時候,編譯器可能不會存盤它,例如:const int b =10;
....
fun(b) ;
這樣的代碼,編譯后可能是
fun(10);
就像我上邊所說,const T 只在編譯期起到作用,如果你通過某種手段,繞過編譯時對const的限制,比如通過參考,取址獲得const變數的具體存盤。你完全可以寫那些const變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/118719.html
標籤:新手樂園
下一篇:程式競賽
