C語言查漏補缺——const-創(chuàng)新互聯(lián)

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

成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的太原網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

二、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;
}
這段代碼,運行結(jié)果如下

C語言查漏補缺——const
不是說好的const修飾的變量是一個常量嗎?常量是什么,就是初始化以后,直到程序結(jié)束,值都不會改變的量。為什么這里被改變了呢?

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

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

因此,得出結(jié)論====>在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;       //不確定,需要知道編譯器是現(xiàn)代編譯器,還是古老的標(biāo)志編譯器
    printf("cig_test = %d\n", cig_test);

    int *p3 = &cism_test;
    *p3 = 5;      //報錯,加上static修飾的變量,存儲在只讀存儲區(qū)
    printf("cism_test = %d\n", cism_test);

    return 0;
}

四、const的擴展
我們可以利用const的這個屬性來規(guī)范一些代碼編寫。
1、const修飾的函數(shù)參數(shù),在函數(shù)內(nèi)部不允許修改。
2、const修飾的函數(shù)返回值,表示函數(shù)的返回值不可以修改
#include <stdio.h>

const char* f(const int i)  
{  
    i = 5;    //error,const變量不能作為左值  

    return "Hello World";    //返回指向只讀存儲區(qū)的指針  
}  

int main()  
{  
    char* pc = f(0); //waring  

    printf("%s\n", pc);  

    pc[6] = '_';    //error,不能修改只讀存儲區(qū)的內(nèi)容  

    printf("%s\n", pc);  

    return 0;  
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前文章:C語言查漏補缺——const-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://bm7419.com/article48/ddhpep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、軟件開發(fā)移動網(wǎng)站建設(shè)、網(wǎng)站營銷網(wǎng)站建設(shè)、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)