const深度分析

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來修飾該指針。並且,不能經過指針去修改函數的返回值。生命週期

相關文章
相關標籤/搜索