一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C/C++ - 詳解C語(yǔ)言中const關(guān)鍵字的用法

詳解C語(yǔ)言中const關(guān)鍵字的用法

2021-03-05 15:32xingjiarong C/C++

這篇文章主要對(duì)C語(yǔ)言中const關(guān)鍵字的用法進(jìn)行了詳細(xì)的分析介紹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

關(guān)鍵字const用來(lái)定義常量,如果一個(gè)變量被const修飾,那么它的值就不能再被改變,我想一定有人有這樣的疑問(wèn),C語(yǔ)言中不是有#define嗎,干嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說(shuō)const的存在一定有它的合理性,與預(yù)編譯指令相比,const修飾符有以下的優(yōu)點(diǎn)

1、預(yù)編譯指令只是對(duì)值進(jìn)行簡(jiǎn)單的替換,不能進(jìn)行類(lèi)型檢查

2、可以保護(hù)被修飾的東西,防止意外修改,增強(qiáng)程序的健壯性

3、編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號(hào)表中,這使得它成為一個(gè)編譯期間的常量,沒(méi)有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。

下面我們從幾個(gè)方面來(lái)說(shuō)一下const的用法:

一、修飾局部變量

?
1
2
const int n=5;
int const n=5;

這兩種寫(xiě)法是一樣的,都是表示變量n的值不能被改變了,需要注意的是,用const修飾變量時(shí),一定要給變臉初始化,否則之后就不能再進(jìn)行賦值了。

接下來(lái)看看const用于修飾常量靜態(tài)字符串,例如:

?
1
const char* str="fdsafdsa";

如果沒(méi)有const的修飾,我們可能會(huì)在后面有意無(wú)意的寫(xiě)str[4]='x'這樣的語(yǔ)句,這樣會(huì)導(dǎo)致對(duì)只讀內(nèi)存區(qū)域的賦值,然后程序會(huì)立刻異常終止。有了const,這個(gè)錯(cuò)誤就能在程序被編譯的時(shí)候就立即檢查出來(lái),這就是const的好處。讓邏輯錯(cuò)誤在編譯期被發(fā)現(xiàn)。

二、常量指針與指針常量

常量指針是指針指向的內(nèi)容是常量,可以有一下兩種定義方式。

?
1
2
const int * n;
int const * n;

需要注意的是一下兩點(diǎn):

1、常量指針說(shuō)的是不能通過(guò)這個(gè)指針改變變量的值,但是還是可以通過(guò)其他的引用來(lái)改變變量的值的。

?
1
2
3
int a=5;
const int* n=&a;
a=6;

2、常量指針指向的值不能改變,但是這并不是意味著指針本身不能改變,常量指針可以指向其他的地址。

?
1
2
3
4
int a=5;
int b=6;
const int* n=&a;
n=&b;

指針常量是指指針本身是個(gè)常量,不能在指向其他的地址,寫(xiě)法如下:

?
1
int *const n;

需要注意的是,指針常量指向的地址不能改變,但是地址中保存的數(shù)值是可以改變的,可以通過(guò)其他指向改地址的指針來(lái)修改。

?
1
2
3
4
int a=5;
int *p=&a;
int* const n=&a;
*p=8;

區(qū)分常量指針和指針常量的關(guān)鍵就在于星號(hào)的位置,我們以星號(hào)為分界線(xiàn),如果const在星號(hào)的左邊,則為常量指針,如果const在星號(hào)的右邊則為指針常量。如果我們將星號(hào)讀作‘指針',將const讀作‘常量'的話(huà),內(nèi)容正好符合。int const * n;是常量指針,int *const n;是指針常量。

指向常量的常指針

是以上兩種的結(jié)合,指針指向的位置不能改變并且也不能通過(guò)這個(gè)指針改變變量的值,但是依然可以通過(guò)其他的普通指針改變變量的值。

?
1
const int* const p;

三、修飾函數(shù)的參數(shù)

根據(jù)常量指針與指針常量,const修飾函數(shù)的參數(shù)也是分為三種情況

1、防止修改指針指向的內(nèi)容

?
1
void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是輸入?yún)?shù),strDestination 是輸出參數(shù)。給 strSource 加上 const 修飾后,如果函數(shù)體內(nèi)的語(yǔ)句試圖改動(dòng) strSource 的內(nèi)容,編譯器將指出錯(cuò)誤。

2、防止修改指針指向的地址

?
1
void swap ( int * const p1 , int * const p2 )

指針p1和指針p2指向的地址都不能修改。

3、以上兩種的結(jié)合。

四、修飾函數(shù)的返回值

如果給以“指針傳遞”方式的函數(shù)返回值加 const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const 修飾的同類(lèi)型指針。

例如函數(shù)

?
1
const char * GetString(void);

如下語(yǔ)句將出現(xiàn)編譯錯(cuò)誤:

?
1
char *str = GetString();

正確的用法是

?
1
const char *str = GetString();

五、修飾全局變量

全局變量的作用域是整個(gè)文件,我們應(yīng)該盡量避免使用全局變量,以為一旦有一個(gè)函數(shù)改變了全局變量的值,它也會(huì)影響到其他引用這個(gè)變量的函數(shù),導(dǎo)致除了bug后很難發(fā)現(xiàn),如果一定要用全局變量,我們應(yīng)該盡量的使用const修飾符進(jìn)行修飾,這樣方式不必要的以為修改,使用的方法與局部變量是相同的。

以上就是const關(guān)鍵字的全部用法希望對(duì)大家靈活運(yùn)用const關(guān)鍵字有所幫助

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91视在线国内在线播放酒店 | 9丨精品国产高清自在线看 9久热这里只有精品免费 | 国产精品久久久久网站 | 猫咪社区免费资源在线观看 | 四虎精品成人免费观看 | 美女脱了内裤张开腿亲吻男生 | 特黄级| 厨房高h| 亚洲 综合 欧美在线视频 | 亚洲不卡视频在线观看 | 久久久无码精品无码国产人妻丝瓜 | 特级淫片大乳女子高清视频 | 日产乱码卡1卡2卡三免费 | 久久99国产精品二区不卡 | 欧美vpswindows | 99久久成人 | 91桃花视频 | 精品91一区二区三区 | 国产麻豆麻豆 | 欧美影院一区二区三区 | 四虎在线网址 | 91视频a| 毛片免费全部免费观看 | 精品国产免费久久久久久婷婷 | 国产播放啪视频免费视频 | 无码人妻视频又大又粗欧美 | eeuss18影院www国产 | 荡娃艳妇系列小说 | 91中文字幕yellow字幕网 | 高h视频免费观看 | 啪啪导航 | 国产成人精品免费大全 | 国产一区日韩二区欧美三 | 欧美高清videosex极品 | 国产欧美国产精品第一区 | 美女视频一区二区三区在线 | a级精品九九九大片免费看 a级动漫 | 龟甲情感超市全文阅读 小说 | 丝瓜茄子绿巨人秋葵榴莲污 | 免费一级特黄特色大片∵黄 | 日本ccc三级 |