1、const的做用
const修飾的變量,變成了一個不可修改的常量,好比int c = 0;
這個時候,c是能夠修改的,可是加上const之後,c的值就變成常量,const int c = 0;
若是這個時候令c = 2;
那麼程序就會報錯。
這就是const的主要做用,可是,在C語言中,const修飾的變量真的就是一個常量嗎?ide
2、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; }
這段代碼,運行結果以下
不是說好的const修飾的變量是一個常量嗎?常量是什麼,就是初始化之後,直到程序結束,值都不會改變的量。爲何這裏被改變了呢?測試
3、const的幾種狀況
在回答上面的問題以前,咱們先考慮const會出現的幾種狀況,
一、const修飾static局部變量
二、const修飾全局變量
三、const修飾局部變量優化
第一種狀況,這個時候的局部變量受到static的影響更大,所以,存儲在只讀存儲區上,沒法進行修改。
第二種狀況,這個時候的就要看編譯器了,若是是早期的編譯器,好比BCC這種的話,變量是存儲在全局數據區,而若是先一些現代c編譯器的話,那麼,編譯器會優化,將其存儲於只讀存儲區。
第三種狀況,這是比較常見的,這種時候,變量是存儲在棧上的,所以,咱們能夠經過指針指向這段內存,而後修改這個值。指針
所以,得出結論====>在C語言中,const修飾的變量,並不徹底是常量。code
下面是測試代碼blog
#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; //不肯定,須要知道編譯器是現代編譯器,仍是古老的標誌編譯器 printf("cig_test = %d\n", cig_test); int *p3 = &cism_test; *p3 = 5; //報錯,加上static修飾的變量,存儲在只讀存儲區 printf("cism_test = %d\n", cism_test); return 0; }
4、const的擴展
咱們能夠利用const的這個屬性來規範一些代碼編寫。
一、const修飾的函數參數,在函數內部不容許修改。
二、const修飾的函數返回值,表示函數的返回值不能夠修改
#include <stdio.h> 內存
const char* f(const int i) { i = 5; //error,const變量不能做爲左值 return "Hello World"; //返回指向只讀存儲區的指針 } int main() { char* pc = f(0); //waring printf("%s\n", pc); pc[6] = '_'; //error,不能修改只讀存儲區的內容 printf("%s\n", pc); return 0; }