您好,登錄后才能下訂單哦!
一、const的作用
const修飾的變量,變成了一個(gè)不可修改的常量,比如int c = 0;
這個(gè)時(shí)候,c是可以修改的,但是加上const以后,c的值就變成常量,const int c = 0;
如果這個(gè)時(shí)候令c = 2;
那么程序就會(huì)報(bào)錯(cuò)。
這就是const的主要作用,但是,在C語(yǔ)言中,const修飾的變量真的就是一個(gè)常量嗎?
二、const的"bug"
我們看下面這段代碼
int main()
{
const int cim_test = 1;
printf("cim_test = %d\n", cim_test);
int *p1 = &cim_test;
*p1 = 3;
printf("cim_test = %d\n", cim_test);
return 0;
}
這段代碼,運(yùn)行結(jié)果如下
不是說(shuō)好的const修飾的變量是一個(gè)常量嗎?常量是什么,就是初始化以后,直到程序結(jié)束,值都不會(huì)改變的量。為什么這里被改變了呢?
三、const的幾種情況
在回答上面的問(wèn)題之前,我們先考慮const會(huì)出現(xiàn)的幾種情況,
1、const修飾static局部變量
2、const修飾全局變量
3、const修飾局部變量
第一種情況,這個(gè)時(shí)候的局部變量受到static的影響更大,因此,存儲(chǔ)在只讀存儲(chǔ)區(qū)上,無(wú)法進(jìn)行修改。
第二種情況,這個(gè)時(shí)候的就要看編譯器了,如果是早期的編譯器,比如BCC這種的話,變量是存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),而如果先一些現(xiàn)代c編譯器的話,那么,編譯器會(huì)優(yōu)化,將其存儲(chǔ)于只讀存儲(chǔ)區(qū)。
第三種情況,這是比較常見(jiàn)的,這種時(shí)候,變量是存儲(chǔ)在棧上的,因此,我們可以通過(guò)指針指向這段內(nèi)存,然后修改這個(gè)值。
因此,得出結(jié)論====>在C語(yǔ)言中,const修飾的變量,并不完全是常量。
下面是測(cè)試代碼
#include <stdio.h>
const int cig_test = 2;
int main()
{
const int cim_test = 1;
const static int cism_test = 3;
printf("cim_test = %d\n", cim_test);
int *p1 = &cim_test;
*p1 = 3;
printf("cim_test = %d\n", cim_test);
int *p2 = &cig_test;
*p2 = 4; //不確定,需要知道編譯器是現(xiàn)代編譯器,還是古老的標(biāo)志編譯器
printf("cig_test = %d\n", cig_test);
int *p3 = &cism_test;
*p3 = 5; //報(bào)錯(cuò),加上static修飾的變量,存儲(chǔ)在只讀存儲(chǔ)區(qū)
printf("cism_test = %d\n", cism_test);
return 0;
}
四、const的擴(kuò)展
我們可以利用const的這個(gè)屬性來(lái)規(guī)范一些代碼編寫(xiě)。
1、const修飾的函數(shù)參數(shù),在函數(shù)內(nèi)部不允許修改。
2、const修飾的函數(shù)返回值,表示函數(shù)的返回值不可以修改
#include <stdio.h>
const char* f(const int i)
{
i = 5; //error,const變量不能作為左值
return "Hello World"; //返回指向只讀存儲(chǔ)區(qū)的指針
}
int main()
{
char* pc = f(0); //waring
printf("%s\n", pc);
pc[6] = '_'; //error,不能修改只讀存儲(chǔ)區(qū)的內(nèi)容
printf("%s\n", pc);
return 0;
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。