C語言查漏補缺——const

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;
}
這段代碼,運行結果以下

C語言查漏補缺——const
不是說好的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;  
}
相關文章
相關標籤/搜索