const屬于變量屬性的一種。使用const修飾的變量,意味著該變量是一個只讀變量,不能隨意的修改該變量的值。但并不意味著,通過const的修飾,該變量就變成了常量,本意上并非常量,只是一個只讀變量。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供井陘網(wǎng)站建設(shè)、井陘做網(wǎng)站、井陘網(wǎng)站設(shè)計、井陘網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、井陘企業(yè)網(wǎng)站模板建站服務(wù),10年井陘做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
int main(){
const int apple = 1;
apple = 2; //error
system ( "pause" );
return 0;
}
此時,通過const修飾變量apple,此時就是只讀變量(read only variable)。那么是否,該內(nèi)存中的值真的無法改變。事實并非如此。我們可以通過聲明指針指向該內(nèi)存空間,通過這個指針,我們是能夠修改變量的值的。代碼如下:
int main(){
const int apple = 1;
int* p = NULL;
p = ( int* )&apple;
printf ( "apple = %d\n", apple );
*p = 2;
printf ( "apple = %d\n", apple );
system ( "pause" );
return 0;
}
我們通過這個指針變量修改了內(nèi)存中的值。
當(dāng)我們通過const來修飾一個全局變量時,它同樣是一個只讀變量,無法直接修改其值。
const int glo_apple = 3;
int main()
{
glo_apple = 4; //error
system ( "pause" );
return 0;
}
很顯然,由于glo_apple是只讀變量,在主函數(shù)中是無法修改其值的。那么,我們是否可以用同樣的方式,聲明一個指針指向全局變量,對全局變量glo_apple進(jìn)行操作呢?
const int glo_apple = 3;
int main()
{
int* glo_p = ( int* ) &glo_apple;
*p = 4; //error
printf ( "glo_apple = %d\n", glo_apple ) ;
system ( "pause" );
return 0;
}
如果將這段代碼用現(xiàn)代編譯器編譯一下,會發(fā)現(xiàn),程序會報錯。為什么呢?原因就在于,用const修飾的全局變量被存放在了“只讀存儲區(qū)”了。用指向全局變量的指針去修改內(nèi)存中的值肯定會報錯。
注意:現(xiàn)代C編譯器中的const將具有全局生命周期的變量存儲于只讀存儲區(qū)。(比如static局部變量也是具有全局生命周期,所以,用const修飾的static局部變量也是存儲于只讀存儲區(qū))
注意:由于字符串字面量被存儲于只讀存儲區(qū),也就是說,該值是不希望也不能被改變的,所以需要使用const來修飾指針變量指向字符串字面量。例如:
const char p = "chentong";
另外,用const修飾的函數(shù)參數(shù),說明不希望在函數(shù)內(nèi)部修改參數(shù)的值。用const修飾函數(shù)返回值,說明函數(shù)的返回值不可變,多用于返回指針的類型。比如,有如下代碼:
#include
#include
const char* f ( const int i ){
i = 4; //error;
return "chentong";
}
int main()
{
const int* p = f( 2 );
printf ( "%s\n", p );
pc[4] = 'o'; //error
printf ( "%s\n", p );
system ( "pause" );
return 0;
}
首先,函數(shù)的參數(shù)i不能在函數(shù)內(nèi)部被修改,因為它是一個被const修飾的只讀變量。其次,函數(shù)的返回值類型是一個const類型的,也就是意味著,函數(shù)返回值不可修改,是個只讀變量,因此,在用指針指向這個函數(shù)時,需要用const來修飾該指針。而且,不能通過指針去修改函數(shù)的返回值。