中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言查漏補缺——const

發布時間:2020-07-26 12:03:42 來源:網絡 閱讀:268 作者:chengarm 欄目:編程語言

一、const的作用
const修飾的變量,變成了一個不可修改的常量,比如
int c = 0;這個時候,c是可以修改的,但是加上const以后,c的值就變成常量,
const int c = 0; 如果這個時候令c = 2;那么程序就會報錯。
這就是const的主要作用,但是,在C語言中,const修飾的變量真的就是一個常量嗎?

二、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修飾的變量是一個常量嗎?常量是什么,就是初始化以后,直到程序結束,值都不會改變的量。為什么這里被改變了呢?

三、const的幾種情況
在回答上面的問題之前,我們先考慮const會出現的幾種情況,
1、const修飾static局部變量
2、const修飾全局變量
3、const修飾局部變量

第一種情況,這個時候的局部變量受到static的影響更大,因此,存儲在只讀存儲區上,無法進行修改。
第二種情況,這個時候的就要看編譯器了,如果是早期的編譯器,比如BCC這種的話,變量是存儲在全局數據區,而如果先一些現代c編譯器的話,那么,編譯器會優化,將其存儲于只讀存儲區。
第三種情況,這是比較常見的,這種時候,變量是存儲在棧上的,因此,我們可以通過指針指向這段內存,然后修改這個值

因此,得出結論====>在C語言中,const修飾的變量,并不完全是常量。

下面是測試代碼

#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;
}

四、const的擴展
我們可以利用const的這個屬性來規范一些代碼編寫。
1、const修飾的函數參數,在函數內部不允許修改。
2、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;  
}  
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贡觉县| 筠连县| 江山市| 东安县| 北流市| 洞头县| 苏尼特左旗| 扎囊县| 中牟县| 沾益县| 分宜县| 开江县| 富蕴县| 灵丘县| 湖北省| 普格县| 乌鲁木齐县| 安溪县| 桂东县| 德昌县| 五华县| 遂川县| 平和县| 陈巴尔虎旗| 拜泉县| 屏东市| 芒康县| 白玉县| 湖州市| 天全县| 龙岩市| 盐津县| 祁门县| 青海省| 慈溪市| 图木舒克市| 曲阜市| 滕州市| 富平县| 勃利县| 临湘市|