c語言和c++語言中const修飾的變量區(qū)別淺析
c:
修飾全局變量:
用const修飾的全局變量是沒有辦法直接修改的,間接的修改也是不成功的(語法可以通過,但是編譯運行的時候會報錯。)(const只要是修飾全局變量,那么就會儲存到常量區(qū)中,收到常量區(qū)的保護。)
修飾局部變量:
但是如果用const修飾局部變量,同樣的也是沒有辦法直接修改的,但是是可以間接修改的。
int main() { const int b = 10; int* p = &b; *p = 20; pirntf("%d",b); return 0; }
這樣就不會報錯。(const修飾的局部變量是儲存到棧上,相當于分配到內(nèi)存上,可以修改成功)。
通常叫這種變量為偽常量,不能用這種常量不能構(gòu)成數(shù)組。arr[偽常量]這種寫法是錯誤的。
c++:
修飾全局變量:
const修飾全局變量的效果是和c語言的一樣的。無論是直接修改還是間接修改都是報錯的。
修飾局部變量:
const修改局部變量,直接修改是不成功的,不會報錯,但是輸出的結(jié)果是修改前的值,相當于沒有修改。因為在c++中,const修飾的無論是局部變量還是全局變量都是常量了。數(shù)組的初始化可以使用這個const修飾的變量了。
int main { const int a = 100; int* p = (int *)&a; *p = 200; cout<<a<<endl;//100 return 0 }
輸出的結(jié)果依然是100,注意給p指針賦值的時候需要將&a進行強制類型轉(zhuǎn)換(c++的要求,因為這個時候&a的類型是const int*)
剖析這個代碼:
int *p = (int *)&a
實際上是int temp = a 先在棧上創(chuàng)建了一個和a的值一樣的變量temp,
當對const修飾的局部變量取地址的時候,編譯器會給變量分配臨時的內(nèi)存空間,這個內(nèi)存空間就是temp的內(nèi)存空間。而給p賦值的時候就是將這個臨時變量的空間的地址賦值給了p。
也就是int*p = &temp然后p指針指向的也就是temp,所以說后來的*p = 200改的就是temp而不是a的值。臨時空間沒有什么意義。
(const int a =100寫出來了以后就一直放在符號表中(鍵值對一一對應著不會改變。))
總結(jié):
在c++語言中,一個const修飾的變量不是必須創(chuàng)建內(nèi)存空間的,c語言中,總是需要一塊內(nèi)存空間。
在c語言中:
對于全局變量:
將const修飾的全局變量存儲在只讀數(shù)據(jù)段,保存在符號表中,第一次使用的時候再分配內(nèi)存,程序結(jié)束的時候釋放。(這個是不能修改的,因為存儲在只讀數(shù)據(jù)段中)
對于局部變量:
將const修飾的局部變量存儲在棧中,代碼塊結(jié)束的時候釋放。(這個是可以修改的,在棧上)
在c++語言中:
對于全局變量:
是否為const變量分配內(nèi)存空間取決于const變量的用途。如果是作為一個值(用這個值去替換一個函數(shù)名),就不分配空間。如果是對這個全局變量取地址,那么會分配內(nèi)存,存儲在只讀數(shù)據(jù)段。兩種都是不能進行修改的。
對于局部變量:
如果是const int a = 100;直接放進符號表中,不分配內(nèi)存。如果對其取地址的話,在棧上分配內(nèi)存空間temp,修改不成功,因為修改的只是temp的值,對在符號表中的a沒有影響。
如果是const int a = b;分配內(nèi)存。
如果是自定義的類型,比如類對象,分配內(nèi)存。
總結(jié)
到此這篇關(guān)于c語言和c++語言中const修飾變量區(qū)別的文章就介紹到這了,更多相關(guān)c語言和c++中const修飾的變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言排序算法之冒泡排序?qū)崿F(xiàn)方法【改進版】
這篇文章主要介紹了C語言排序算法之冒泡排序?qū)崿F(xiàn)方法,結(jié)合具體實例形式分析了C語言實現(xiàn)的基本冒泡排序?qū)崿F(xiàn)方法及增設flag標志位的改進型算法,需要的朋友可以參考下2017-09-09使用C語言打造通訊錄管理系統(tǒng)和教學安排系統(tǒng)的代碼示例
這篇文章主要介紹了使用C語言打造通訊錄管理系統(tǒng)和教學安排系統(tǒng)的代碼示例,利用C語言強大的數(shù)組和指針能夠更加清晰地體現(xiàn)設計思路:D 需要的朋友可以參考下2016-06-06VS2019開發(fā)簡單的C/C++動態(tài)鏈接庫并進行調(diào)用的實現(xiàn)
這篇文章主要介紹了VS2019開發(fā)簡單的C/C++動態(tài)鏈接庫并進行調(diào)用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03