C語言中const的用法

const是一個C語言的關(guān)鍵字,它限定一個變量不允許被改變奕枢。使用const在一定程度上可以提高程序的安全性和可靠性娄昆,另外,在觀看別人代碼的時候缝彬,清晰理解const所起的作用萌焰,對理解對方的程序也有一些幫助。

我們來分情況看語法上它該如何被使用谷浅。

1扒俯、函數(shù)體內(nèi)修飾局部變量。

例:

void func()

{

const int a=0;

}

首先一疯,我們先把const這個單詞忽略不看撼玄,那么a是一個int類型的局部自動變量,我們給它賦予初始值0墩邀。然后再看const.

const作為一個類型限定詞掌猛,和int有相同的地位。

const int a;

int const a;

是等價的眉睹。于是此處我們一定要清晰的明白留潦,const修飾的對象是誰,是a,和int沒有關(guān)系辣往。const 要求他所修飾的對象為常量兔院,不可被改變,不可被賦值站削,不可作為左值(l-value)坊萝。

這樣的寫法也是錯誤的。

const int a;

a=0;

這是一個很常見的使用方式:

const double pi=3.14;

在程序的后面如果企圖對pi再次賦值或者修改就會出錯。

然后看一個稍微復(fù)雜的例子十偶。

const int* p;

還是先去掉const 修飾符號菩鲜。

注意,下面兩個是等價的惦积。

int* p;

int *p;

其實我們想要說的是接校,*p是int類型。那么顯然狮崩,p就是指向int的指針蛛勉。

同理

const int* p;

其實等價于

const int (*p);

int const (*p);

即,*p是常量睦柴。也就是說诽凌,p指向的數(shù)據(jù)是常量。

于是

p+=8; //合法

*p=3; //非法坦敌,p指向的數(shù)據(jù)是常量侣诵。

那么如何聲明一個自身是常量指針呢?方法 是讓const盡可能的靠近p;

int* const p;

const右面只有p,顯然狱窘,它修飾的是p,說明p不可被更改杜顺。然后把const去掉,可以看出p是一個指向 int形式變量的指針蘸炸。

于是

p+=8; //非法

*p=3; //合法

再看一個更復(fù)雜的例子躬络,它是上面二者的綜合

const int* const p;

說明p自己是常量,且p指向的變量也是常量幻馁。

于是

p+=8; //非法

*p=3; //非法

const 還有一個作用就是用于修飾常量靜態(tài)字符串洗鸵。

例如:

const char* name='David';

如果沒有const,我們可能會在后面有意無意的寫name[4]='x'這樣的語句,這樣會導(dǎo)致對只讀內(nèi)存區(qū)域的賦值仗嗦,然后程序會立刻異常終止膘滨。有了 const,這個錯誤就能在程序被編譯的時候就立即檢查出來,這就是const的好處稀拐。讓邏輯錯誤在編譯期被發(fā)現(xiàn)火邓。

const 還可以用來修飾數(shù)組

const char s[]='David';

與上面有類似的作用。

2德撬、在函數(shù)聲明時修飾參數(shù)

來看實際中的一個例子铲咨。

NAME

memmove -- copy byte string

LIBRARY

Standard C Library (libc, -lc)

SYNOPSIS

#include

void *

memmove(void *dst, const void *src, size_t len);

這是標(biāo)準(zhǔn)庫中的一個函數(shù),用于按字節(jié)方式復(fù)制字符串(內(nèi)存)蜓洪。它的第一個參數(shù)纤勒,是將字符串復(fù)制到哪里去(dest),是目的地,這段內(nèi)存區(qū)域必須是可寫隆檀。它的第二個參數(shù)摇天,是要將什么樣的字符串復(fù)制出去粹湃,我們對這段內(nèi)存區(qū)域只做讀取,不寫泉坐。于是为鳄,我們站在這個函數(shù)自己的角度來看,src 這個指針腕让,它所指向的內(nèi)存內(nèi)所存

儲的數(shù)據(jù)在整個函數(shù)執(zhí)行的過程中是不變孤钦。于是src所指向的內(nèi)容是常量。于是就需要用const修飾纯丸。例如偏形,我們這里這樣使用它。

const char* s='hello';

char buf[100];

memmove(buf,s,6); //這里其實應(yīng)該用strcpy或memcpy更好

如果我們反過來寫液南,

memmove(s,buf,6);

那么編譯器一定會報錯壳猜。事實是我們經(jīng)常會把各種函數(shù)的參數(shù)順序?qū)懛垂椿铡J聦嵤蔷幾g器在此時幫了我們大忙滑凉。如果編譯器靜悄悄的不報錯,(在函數(shù)聲明處去掉const即可),那么這個程序在運行的時候一定會崩潰喘帚。

這里還要說明的一點是在函數(shù)參數(shù)聲明中const一般用來聲明指針而不是變量本身畅姊。

例如,上面的size_t len,在函數(shù)實現(xiàn)的時候可以完全不用更改len的值吹由,那么是否應(yīng)該把len也聲明為常量呢若未?可以,可以這么做倾鲫。我們來分析這么做有什么優(yōu)劣粗合。

如果加了const,那么對于這個函數(shù)的實現(xiàn)者,可以防止他在實現(xiàn)這個函數(shù)的時候修改不需要修改的值(len),這樣很好乌昔。

但是對于這個函數(shù)的使用者隙疚,

1。這個修飾符號毫無意義磕道,我們可以傳遞一個常量整數(shù)或者一個非常量整數(shù)過去供屉,反正對方獲得的只是我們傳遞的一個copy。

2溺蕉。暴露了實現(xiàn)伶丐。我不需要知道你在實現(xiàn)這個函數(shù)的時候是否修改過len的值。

所以疯特,const一般只用來修飾指針哗魂。

再看一個復(fù)雜的例子

int execv(const char *path, char *const argv[]);

著重看后面這個,argv.它代表什么漓雅。

如果去掉const,我們可以看出

char * argv[];

argv是一個數(shù)組录别,它的每個元素都是char *類型的指針羹与。

如果加上const.那么const修飾的是誰呢?他修飾的是一個數(shù)組庶灿,argv[],意思就是說這個數(shù)組的元素是只讀的纵搁。那么數(shù)組的元素的是什么類型呢?是char *類型的指針.也就是說指針是常量往踢,而它指向的數(shù)據(jù)不是腾誉。

于是

argv[1]=NULL; //非法

argv[0][0]='a'; //合法

3、全局變量峻呕。

我們的原則依然是利职,盡可能少的使用全局變量。我們的第二條規(guī)則 則是瘦癌,盡可能多的使用const猪贪。如果一個全局變量只在本文件中使用,那么用法和前面所說的函數(shù)局部變量沒有什么區(qū)別讯私。如果它要在多個文件間共享热押,那么就牽扯到一個存儲類型的問題。

有兩種方式斤寇。

1.使用extern

例如

extern const double pi;

const double pi=3.14;

然后其他需要使用pi這個變量的桶癣,包含file1.h

#include 'file1.h'

或者,自己把那句聲明復(fù)制一遍就好娘锁。

這樣做的結(jié)果是牙寞,整個程序鏈接完后,所有需要使用pi這個變量的共享一個存儲區(qū)域莫秆。

2.使用static,靜態(tài)外部存儲類

static const pi=3.14;

需要使用這個變量的*.c文件中间雀,必須包含這個頭文件。

前面的static一定不能少镊屎。否則鏈接的時候會報告說該變量被多次定義惹挟。這樣做的結(jié)果是,每個包含了constant.h的*.c文件杯道,都有一份該變量自己的copy,該變量實際上還是被定義了多次匪煌,占用了多個存儲空間,不過在加了static關(guān)鍵字后党巾,解決了文件間重定義的沖突萎庭。壞處是浪費了存儲空間,導(dǎo)致鏈接完后的可執(zhí)行文件變大齿拂。但是通常驳规,這個,小小幾字節(jié)的變化署海,不是問題吗购。好處是医男,你不用關(guān)心這個變量是在哪個文件中被初始化的。

最后捻勉,說說const的作用镀梭。

const 的好處,是引入了常量的概念踱启,讓我們不要去修改不該修改的內(nèi)存报账。直接的作用就是讓更多的邏輯錯誤在編譯期被發(fā)現(xiàn)。所以我們要盡可能的多使用const埠偿。但是很多人并不習(xí)慣使用它透罢,更有甚者,是在整個程序 編寫/調(diào)試 完后才補(bǔ)const冠蒋。如果是給函數(shù)的聲明補(bǔ)const,尚好羽圃。如果是給 全局/局部變量補(bǔ)const,那么……那么,為時已晚抖剿,無非是讓代碼看起來更漂亮了朽寞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市牙躺,隨后出現(xiàn)的幾起案子愁憔,更是在濱河造成了極大的恐慌腕扶,老刑警劉巖孽拷,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異半抱,居然都是意外死亡脓恕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門窿侈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼幔,“玉大人,你說我怎么就攤上這事史简∧诵悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵圆兵,是天一觀的道長跺讯。 經(jīng)常有香客問我,道長殉农,這世上最難降的妖魔是什么刀脏? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮超凳,結(jié)果婚禮上愈污,老公的妹妹穿的比我還像新娘耀态。我一直安慰自己,他們只是感情好暂雹,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布首装。 她就那樣靜靜地躺著,像睡著了一般杭跪。 火紅的嫁衣襯著肌膚如雪簿盅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天揍魂,我揣著相機(jī)與錄音桨醋,去河邊找鬼。 笑死现斋,一個胖子當(dāng)著我的面吹牛喜最,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庄蹋,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞬内,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了限书?” 一聲冷哼從身側(cè)響起虫蝶,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倦西,沒想到半個月后能真,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡扰柠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年粉铐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卤档。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝙泼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劝枣,到底是詐尸還是另有隱情汤踏,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布舔腾,位于F島的核電站溪胶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琢唾。R本人自食惡果不足惜载荔,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望采桃。 院中可真熱鬧懒熙,春花似錦丘损、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肢娘,卻和暖如春呈础,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背橱健。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工而钞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拘荡。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓臼节,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珊皿。 傳聞我的和親對象是個殘疾皇子网缝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.語言中變量的實質(zhì) 要理解C指針,我認(rèn)為一定要理解C中“變量”的存儲實質(zhì)蟋定, 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,779評論 0 9
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型粉臊。 運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)驶兜; ...
    朱森閱讀 3,444評論 3 44
  • 注:這是第三遍讀《C語言深度解剖》扼仲,想想好像自從大學(xué)開始就沒讀完過幾本書,其中譚浩強(qiáng)的那本《C語言程序設(shè)計(第四版...
    HavenXie閱讀 1,725評論 1 6
  • 好不容易給了自己勇氣促王,想出去走走來調(diào)整一天的蝸居狀態(tài)犀盟,可偏偏下起了小雨,只好返回家里蝇狼,坐在陽臺上聆聽下雨的聲音。 ...
    Leo簡說閱讀 926評論 2 9
  • 大年初四倡怎,溫度降下來了迅耘,街上行人很少,坐在新華書店門口的毛澤東像下监署,困意一陣陣地來颤专。街心廣場十字路口的廣播在重復(fù)播...
    九九鷗閱讀 118評論 0 1