色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 對const關鍵字的理解
對const關鍵字的理解
時間:2017-01-05作者:華清遠見

目前在進行C語言補習時,發現很多的同學對于const這個關鍵字的理解存在很大的誤解。現在總結下對這個關鍵字理解上的誤區,希望在以后的編程中,能夠靈活使用const這個關鍵字。

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

對于這個問題,很多同學認為const修飾的變量是不能改變,結果就誤認為該變量變成了常量。那么對于const修飾的變量該如何理解那?

下面我們來看一個例子:

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

        a = 10;
        }

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

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

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

其中后一句printf的目的是看下變量a的值是否改變,根據const的理解,如果const修飾的是變量是不能被修改的話,那么a的值一定不會改變,肯定還是0。但是在實際運行的結果中,我們發現a的值已經變為97了。這說明const修飾的變量a,已經被我們程序修改了。

那綜合這兩個例子,我們來分析下,對于第二例子,修改的原因是buf[4]的賦值操作,我們知道buf[4]這個變量已經造成了buf這個數組變量的越界訪問。buf數組的成員本身只有0,1,2,3,那么buf[4]訪問的是誰那,根據局部變量的地址分配,可以知道buf[4]的地址和int a的地址是一樣,那么buf[4]實際上就是訪問了const int a;那么對buf[4]的修改,自然也修改了const int a的空間,這也是為什么我們在后打印a的值的時候看到了97這個結果。

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

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

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

2、 被const修飾的變量,會被操作系統保護,防止修改

如果對于第一個問題,有了理解的話,那么這個問題,就非常容易知道答案了。Const修飾的變量是不會被操作系統保護的。

其原因是操作系統只保護常量,而不會保護變量的讀寫。那么什么是常量?比如“hello world”這個字符串就是被稱為字符串常量。

對于這個問題的另一種證明方法,可以看下面這個程序:

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

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

可以發現buf保存的地址是在0x08048000這個地址附近的,而a的地址是在0xbf000000這個地址附近的,而0x08048000附近的地址在我們linux操作系統上是代碼段。這也說明了常量和變量是存放在不同區域的,自然操作系統是會保護常量的。

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

int main
        {
                char *buf = “hello”;

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

我們可以思考下,這個程序的運行結果會是什么呢?

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 国产成人无码AV在线播放DVD | 永久免费精品精品永久-夜色 | 色噜噜狠狠狠狠色综合久 | 日本一级淫片视频三爬 | 日日婷婷夜日日天干A片 | 欧美高清性xxxxhdvideosex | 成人免费无码大片a毛片抽搐 | 少妇愉情理伦片丰满丰满午夜 | 丰满少妇作爱视频免费观看 | 四虎永久在线精品无码视频 | 欧洲grand老妇人bbw | 亚洲AV成人无码人在线观看堂 | www.蜜桃视频.com | 日韩欧美在线播放 | 少妇人妻偷人精品视频1出轨 | 在线免费日本 | 中文字幕人成人乱码亚洲影视的特点 | 丰满无码人妻热妇无码 | 欧美视频一区二区三区在线观看 | 嫩草影院一二三四 | 激情欧美成人小说在线视频 | 久久久久无码国产精品一区乞丐 | 野花香日本在线观看免费视频 | 黄色免费看片网站 | 成人精品av一区二区三区 | 亚洲中文字幕成人无码 | gogogo免费观看视频高清 | 日韩久久网| 国产三香港三韩国三级 | 日日噜噜噜夜夜爽爽狠狠视频 | 亚洲精品久久久久久久蜜臀老牛 | 欧美日韩免费一久久亚洲色WWW成人小说 | 日本欧美一区二区三区在线播放 | 色偷偷色偷偷色偷偷在线视频 | 欧美色欲色欲XXXXX | 国产精品久久自在自线青柠 | 人人妻人人澡人人爽人人精品97 | 精品人妻一区二区三区四区 | 久久无码人妻一区二区三区午夜 | 国产精品极品美女自在线观看免费 | 福利姬液液酱喷水 |