国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠(yuǎn)見教育科技集團(tuán)<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > 對(duì)const關(guān)鍵字的理解
對(duì)const關(guān)鍵字的理解
時(shí)間:2017-01-05作者:華清遠(yuǎn)見

目前在進(jìn)行C語言補(bǔ)習(xí)時(shí),發(fā)現(xiàn)很多的同學(xué)對(duì)于const這個(gè)關(guān)鍵字的理解存在很大的誤解,F(xiàn)在總結(jié)下對(duì)這個(gè)關(guān)鍵字理解上的誤區(qū),希望在以后的編程中,能夠靈活使用const這個(gè)關(guān)鍵字。

1、 const修飾的變量是常量還是變量

對(duì)于這個(gè)問題,很多同學(xué)認(rèn)為const修飾的變量是不能改變,結(jié)果就誤認(rèn)為該變量變成了常量。那么對(duì)于const修飾的變量該如何理解那?

下面我們來看一個(gè)例子:

int main
        {
                char buf[4];
                const int a = 0;

        a = 10;
        }

這個(gè)比較容易理解,編譯器直接報(bào)錯(cuò),原因在于“a = 10;”這句話,對(duì)const修飾的變量,后面進(jìn)行賦值操作。這好像說明了const修飾的變量是不能被修改的,那究竟是不是那,那么下面我們把這個(gè)例子修改下:

int main
        {
                char buf[4];
                const int a = 0;

        buf[4] = 97;
                printf(“the a is %d\n”,a);
        }

其中后一句printf的目的是看下變量a的值是否改變,根據(jù)const的理解,如果const修飾的是變量是不能被修改的話,那么a的值一定不會(huì)改變,肯定還是0。但是在實(shí)際運(yùn)行的結(jié)果中,我們發(fā)現(xiàn)a的值已經(jīng)變?yōu)?7了。這說明const修飾的變量a,已經(jīng)被我們程序修改了。

那綜合這兩個(gè)例子,我們來分析下,對(duì)于第二例子,修改的原因是buf[4]的賦值操作,我們知道buf[4]這個(gè)變量已經(jīng)造成了buf這個(gè)數(shù)組變量的越界訪問。buf數(shù)組的成員本身只有0,1,2,3,那么buf[4]訪問的是誰那,根據(jù)局部變量的地址分配,可以知道buf[4]的地址和int a的地址是一樣,那么buf[4]實(shí)際上就是訪問了const int a;那么對(duì)buf[4]的修改,自然也修改了const int a的空間,這也是為什么我們?cè)诤蟠蛴的值的時(shí)候看到了97這個(gè)結(jié)果。

那么我們現(xiàn)在可以知道了,const修飾的變量是不具備不允許修改的特性的,那么對(duì)于第一個(gè)例子的現(xiàn)象我們又如何解釋那。

第一個(gè)例子,錯(cuò)誤是在程序編譯的時(shí)候給出的,注意這里,這個(gè)時(shí)候并沒有生成可執(zhí)行文件,說明const修飾的變量可否修改是由編譯器來幫我們保護(hù)了。而第二個(gè)例子里,變量的修改是在可執(zhí)行程序執(zhí)行的時(shí)候修改的,說明a還是一個(gè)變量。

綜上所述,我們可以得出一個(gè)結(jié)論,那就是const修飾的變量,其實(shí)質(zhì)是告訴程序員或編譯器該變量為只讀,如果程序員在程序中顯示的修改一個(gè)只讀變量,編譯器會(huì)毫不留情的給出一個(gè)error。而對(duì)于由于像數(shù)組溢出,隱式修改等程序不規(guī)范書寫造成的運(yùn)行過程中的修改,編譯器是無能為力的,也說明const修飾的變量仍然是具備變量屬性的。

2、 被const修飾的變量,會(huì)被操作系統(tǒng)保護(hù),防止修改

如果對(duì)于第一個(gè)問題,有了理解的話,那么這個(gè)問題,就非常容易知道答案了。Const修飾的變量是不會(huì)被操作系統(tǒng)保護(hù)的。

其原因是操作系統(tǒng)只保護(hù)常量,而不會(huì)保護(hù)變量的讀寫。那么什么是常量?比如“hello world”這個(gè)字符串就是被稱為字符串常量。

對(duì)于這個(gè)問題的另一種證明方法,可以看下面這個(gè)程序:

int main
        {
                const int a;
                char *buf = “hello world”;

        printf(“the &a is %p, the buf is %p\n”,&a, buf);
        }

可以發(fā)現(xiàn)buf保存的地址是在0x08048000這個(gè)地址附近的,而a的地址是在0xbf000000這個(gè)地址附近的,而0x08048000附近的地址在我們linux操作系統(tǒng)上是代碼段。這也說明了常量和變量是存放在不同區(qū)域的,自然操作系統(tǒng)是會(huì)保護(hù)常量的。

如果我們知道這個(gè)道理后,再看下面的題目:

int main
        {
                char *buf = “hello”;

        buf[0] = ‘a’;
                printf(“the buf is %s\n”,buf);
        }

我們可以思考下,這個(gè)程序的運(yùn)行結(jié)果會(huì)是什么呢?

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)