const屬於變量屬性的一種。使用const修飾的變量,意味着該變量是一個只讀變量,不能隨意的修改該變量的值。但並不意味着,經過const的修飾,該變量就變成了常量,本意上並不是常量,只是一個只讀變量。app
int main(){ const int apple = 1; apple = 2; //error system ( "pause" ); return 0; }
此時,經過const修飾變量apple,此時就是隻讀變量(read only variable)。那麼是否,該內存中的值真的沒法改變。事實並不是如此。咱們能夠經過聲明指針指向該內存空間,經過這個指針,咱們是可以修改變量的值的。代碼以下:ide
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; }
咱們經過這個指針變量修改了內存中的值。
當咱們經過const來修飾一個全局變量時,它一樣是一個只讀變量,沒法直接修改其值。函數
const int glo_apple = 3; int main() { glo_apple = 4; //error system ( "pause" ); return 0; }
很顯然,因爲glo_apple是隻讀變量,在主函數中是沒法修改其值的。那麼,咱們是否能夠用一樣的方式,聲明一個指針指向全局變量,對全局變量glo_apple進行操做呢?指針
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; }
若是將這段代碼用現代編譯器編譯一下,會發現,程序會報錯。爲何呢?緣由就在於,用const修飾的全局變量被存放在了「只讀存儲區」了。用指向全局變量的指針去修改內存中的值確定會報錯。
注意:現代C編譯器中的const將具備全局生命週期的變量存儲於只讀存儲區。(好比static局部變量也是具備全局生命週期,因此,用const修飾的static局部變量也是存儲於只讀存儲區)
注意:因爲字符串字面量被存儲於只讀存儲區,也就是說,該值是不但願也不能被改變的,因此須要使用const來修飾指針變量指向字符串字面量。例如:
const char p = "chentong";
另外,用const修飾的函數參數,說明不但願在函數內部修改參數的值。用const修飾函數返回值,說明函數的返回值不可變,多用於返回指針的類型。好比,有以下代碼:code
#include <stdio.h> #include <stdlib.h> 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; }
首先,函數的參數i不能在函數內部被修改,由於它是一個被const修飾的只讀變量。其次,函數的返回值類型是一個const類型的,也就是意味着,函數返回值不可修改,是個只讀變量,所以,在用指針指向這個函數時,須要用const來修飾該指針。並且,不能經過指針去修改函數的返回值。生命週期