C/C++:Const總結

指針變量和它所指向的內(nèi)存空間是兩個不同的概念

由于Const在C和C++中存在差異拄踪,本篇將會對Const在兩種語言的表現(xiàn)異同點上進行對比探討币厕。

實現(xiàn)方式不同

在C語言中狐援,Const修飾的變量只是告訴編譯器該變量是一個只讀的變量栏账,不能通過該變量改寫器內(nèi)存空間中的值梁钾,但是其本質(zhì)上還是一個變量,既然是變量祭往,就會有內(nèi)存地址伦意,因此可以通過指針間接修改該地址空間的值。

const int a = 10;
int* p = &a;
*p = 20;
printf("a = %d, *p = %d\n", a, *p);
-------------結果------------------
a = 20, *p = 20

在C++中Const修飾的變量被稱為常量硼补,其值存放在常量表中驮肉,在使用常量時,編譯器回到常量表中查詢對應的常量已骇,并將其替換离钝,這部分沒有涉及內(nèi)存分配,因此對其取地址是沒有意義的褪储。但是當我們非要對該常量去地址時卵渴,則編譯器會為其臨時分配一個內(nèi)存,并將常量值存入該臨時內(nèi)存中鲤竹,事實上浪读,在C++中規(guī)定必須用const修飾的指針來指向const修飾的常量。雖然可以使用強制轉換的方式辛藻,對Const修飾的常量進行去地址碘橘,并將其賦值給一個非Const修飾的指針(最好不要這樣做),但打這個指針上的任何改動都只會影響到臨時分配的內(nèi)存空間吱肌,而不會影響到原常量上蛹屿。

const int a = 10;
int* p = (int *)&a;
*p = 20;
printf("a = %d, *p = %d\n", a, *p);
-------------結果------------------
a = 10, *p = 20

變量的文件作用域

在C語言中,訪問一個變量之前岩榆,該變量必須要被預先定義错负,當訪問一個由外部文件定義的變量時,則必須要提前聲明該變量勇边。來看下面幾個例子犹撒。

// main.c
extern int a;
int main() {
    printf("a = %d\n", a);
    return 0;
}
//ln_const.c
int a = 128;
--------結果-------
a = 128

上面的例子是一個標準C語言訪問外部變量的例子。我們編寫代碼時也應該遵守這樣的規(guī)則粒褒。但是识颊,總有寫人不是那么規(guī)范,例如可以在main.c文件中將extern關鍵字去掉奕坟。

// main.c
int a;
int main() {
    printf("a = %d\n", a);
    return 0;
}
//ln_const.c
int a = 128;
--------結果-------
a = 128

我們發(fā)現(xiàn)實際上結果并沒有變化祥款,因為編譯器在編譯時,如果在當前文件中該變量沒有被定義月杉,則會從其他文件中尋找定義并鏈接刃跛。因此結果是沒有問題的。那么如果變量a的定義被設定成文件內(nèi)私有時苛萎,將會發(fā)生什么呢桨昙?

// main.c
int a;
int main() {
    printf("a = %d\n", a);
    return 0;
}
// ln_const.c
static int a = 128;
--------結果-------
a = 0

發(fā)生這種現(xiàn)象的原因是检号,編譯器沒有找到該變量的外部定義,則直接將聲明默認為定義蛙酪,因此變量a是一個默認賦值齐苛。事實上extern關鍵字的作用就是,告訴編譯器桂塞,該變量的值是由外部文件定義的凹蜂。因此當我們聲明一個外部變量時,如果編譯器無法再外部找到該變量的定義阁危,則會無法編譯通過炊甲。

// main.c
extern int a;
int main() {
    printf("a = %d\n", a);
    return 0;
}
// ln_const.c
static int a = 128;
--------結果-------
編譯失敗,無法解析外部符號a

那么如果我們在外部定義了一個Const變量欲芹,情況是否會有不同呢?在標準情況下吟吝,聲明和定義菱父,應該是保持一致的。因此標準做法應該是這樣的剑逃。

// main.c
extern const int a ;
int main() {
    printf("a = %d\n", a);
    return 0;
}

// ln_const.c
const int a = 128;
-----結果---------
a = 128

C語言的難點之一就是規(guī)范標準浙宜,總有人會在聲明時忘記const關鍵字,但是結果也是正確的蛹磺。

// main.c
extern int a ;
int main() {
    printf("a = %d\n", a);
    return 0;
}

// ln_const.c
const int a = 128;
-----結果---------
a = 128

既然a在聲明時并沒有Const修飾是不是意味著粟瞬,可以直接修改a呢?

// main.c
extern int a ;
int main() {
    a = 20;
    printf("a = %d\n", a);
    return 0;
}

// ln_const.c
const int a = 128;
-----結果---------
編譯失敗萤捆,運行時異常

這里裙品,我們可以看出,變量的聲明幫助編譯器進行語法檢查俗或,但變量的定義決定了運行時的行為市怎。

static關鍵字和Const關鍵字同時修飾變量時,Const是否會修改變量的文件作用域呢辛慰?

// main.c
extern int a ;
int main() {
    printf("a = %d\n", a);
    return 0;
}

// ln_const.c
static const int a = 128;
-----結果---------
編譯失敗区匠,無法解析外部符號a

總結:在C語言中,變量文件作用域一般都是外部鏈接帅腌,除非使用static關鍵字修飾驰弄,Const關鍵字并不會改變變量的文件作用域

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市速客,隨后出現(xiàn)的幾起案子戚篙,更是在濱河造成了極大的恐慌,老刑警劉巖溺职,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已球,死亡現(xiàn)場離奇詭異臣镣,居然都是意外死亡,警方通過查閱死者的電腦和手機智亮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門忆某,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阔蛉,你說我怎么就攤上這事弃舒。” “怎么了状原?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵聋呢,是天一觀的道長。 經(jīng)常有香客問我颠区,道長削锰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任毕莱,我火速辦了婚禮器贩,結果婚禮上,老公的妹妹穿的比我還像新娘朋截。我一直安慰自己蛹稍,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布部服。 她就那樣靜靜地躺著唆姐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廓八。 梳的紋絲不亂的頭發(fā)上奉芦,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音剧蹂,去河邊找鬼仗阅。 笑死,一個胖子當著我的面吹牛国夜,可吹牛的內(nèi)容都是我干的减噪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼车吹,長吁一口氣:“原來是場噩夢啊……” “哼筹裕!你這毒婦竟也來了?” 一聲冷哼從身側響起窄驹,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朝卒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乐埠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抗斤,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡囚企,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瑞眼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龙宏。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伤疙,靈堂內(nèi)的尸體忽然破棺而出银酗,到底是詐尸還是另有隱情,我是刑警寧澤徒像,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布黍特,位于F島的核電站,受9級特大地震影響锯蛀,放射性物質(zhì)發(fā)生泄漏灭衷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一旁涤、第九天 我趴在偏房一處隱蔽的房頂上張望翔曲。 院中可真熱鬧,春花似錦拭抬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纷闺,卻和暖如春算凿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犁功。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工氓轰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浸卦。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓署鸡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親限嫌。 傳聞我的和親對象是個殘疾皇子靴庆,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359