程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++中const變量真的不可以修改嗎?

c++中const變量真的不可以修改嗎?

編輯:C++入門知識

在學c++的時候,看到的大部分的書籍對const關鍵字的介紹都是:const關鍵字修飾的變量的值是不可被修改的。但是事實真是如此嗎?今天做了一個小的實驗,發現const變量是可以被修改的。c++代碼如下:          
 1 #include <iostream>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     const int a = 3;
 7     int* p = const_cast<int*>(&a);
 8     *p = 4;
 9     cout << "value of p: " << *p << endl;
10     cout << "value of a: " << a << endl;
11     cout << "address of p: " << p << endl;
12     cout << "address of a: " << &a << endl;
13
14     return 0;
15 }            
上面代碼第7行將a的地址賦值給指針p,然後第8行修改p所指向的地址中的值,運行結果如下:
運行結果
value of p: 4
value of a: 3
address of p: 0x7fbffff7fc
address of a: 0x7fbffff7fc
如上所示結果,指針p所指向的地址和變量a的地址相同,但是p所指地址中的值已經發生改變。但是為何變量a對應的地址中的值已經由3變為4,但是a的值確實3呢?
暫時把這個問題擱淺。再來看一下如下的c++代碼:
 1 #include <iostream>
 2 using namespace std;
 3 const int a = 3;
 4 int main()
 5 {
 6     //const int a = 3;
 7     int* p = const_cast<int*>(&a);
 8     *p = 4;
 9     cout << "value of p: " << *p << endl;
10     cout << "value of a: " << a << endl;
11     cout << "address of p: " << p << endl;
12     cout << "address of a: " << &a << endl;
13
14     return 0;
15 }
如上代碼g++編譯通過,在運行時報錯如下:
輸出結果
Segmentation fault (core dumped)
由此可見,在c++中全局const變量和局部const變量的編譯器處理的方法是不一樣的。查閱資料得知,全局const變量是不分配內存地址的,它編譯器放置在符號表中作為編譯期常量,全局const變量放在只讀數據段中,受到只讀數據段的權限保護,當你修改一個只讀數據段中的內容時,會得到一個運行時錯誤。而局部const變量是放在堆棧之中,因為在內存中有地址,通過修改地址中的值可以達到修改const所指內存中值的目的。


作者  MrRightLeft

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved