const關鍵字和指針的糾纏

const關鍵字定義的變量

#include<stdio.h>int  main( void )
{    const int a = 10;

    a = 20;
}12345671234567

結果怎樣?

編譯錯誤

[Error] assignment of read-only variable ‘a’ 變量a是隻讀的。

得到一個結論,使用const修飾的變量是常量,我們無法修改。在gcc中把const常量放到了data段,和全局變量一樣,只是把它放到了一個區域中讓我們無法修改,在運行過程中並沒有標記const。

瞭解內容:

三種內存來源: 棧(stack) 堆(heap) 數據區(data)(也就是數據段) 
(1)在操作系統專用獲取內存的三種方式(C語言程序中): 棧(stack) 堆(heap) 數據區(data)(也就是數據段)

難道const定義的變量真的不能被修改嗎?

#include<stdio.h>int  main( void )
{    const int a = 10;    int * p = &a;
    *p = 20;
    printf(" a = %d\n ",a);
}//編譯信息:[Warning] initialization discards 'const' qualifier from pointer target type [enabled by default]1234567891012345678910

變量a居然被修改了。。。好神奇。再來深入理解const含義,const定義的變量真的是不能被修改嗎?不是的。有時候我們在傳輸數據的時候,只希望從我家血池傳送到地方水晶去,在中途不被幹擾,就讓const來保駕護航,保護變量a的安全。但是若有一個更強大的英雄(指針)來刺殺變量a,也是有可能的,不僅無視const守衛,還幹掉了變量a。

使用const關鍵字主要是告訴程序員和編譯器,這個變量不必要修改,我們的目的是使用它,不是改變它(若要惡意修改也是可以做到的)

注意: 
第一次直接給const常量賦值的編譯信息是error,第二次通過指針給const常量賦值的編譯信息是warning,這也證明了,const常量可以修改,但是一定要注意自己在幹什麼,也就是說程序員一定要知道自己已經修改了const常量。

const和指針結合

const 修飾指針有4中形式,區分這四種即可理解const和指針。 
第一種:const int*p // 指針所指向的變量是常量 
第二種:int const *p //指針所指向的變量是常量 
第三種:int* const p // 指針p本身是常量 
第四種:const int * const p //指針p本身和他所指向的變量都是常量

有點亂哈,記住這句話就好多了

注意區分指針變量本身指針所指向的變量。一個const只能修飾一個變量。

>第一種:const int * p              //  指針所指向的變量是常量
    int a = 10;    int b = 20;    const int * p =&a; 
    //*p = 30;  //const修飾的是指針所指向的變量,所以這行出錯
    p = &b;     //指針變量本身是可以修改的>第二種:int  const  *p         //指針所指向的變量是常量
    int a = 10;    int b = 20;    const int * p =&a; 
    //*p = 30;  //const修飾的是指針所指向的變量,所以這行出錯
    p = &b;     //指針變量本身是可以修改的上面兩種情況都是指針指向的變量是常量不可修改,下面來看指針本身是不可修改的。

>第三種:int* const p           // 指針p本身是常量
    int a = 10;    int b = 20;    int * const p = &a;     //指針指向a
    *p = 30;                //指針指向的變量是可以修改的
    //p = &b;                   //指針p本身是不可修改的>第四種:const int * const p  //指針p本身和他所指向的變量都是常量
    int a = 10;    int b = 20;    const int *const p = &a;    //指針本身和指針指向的變量都是不可修改的
    //*p = 30;      出錯
    //p = &b;       出錯12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829

怎麼區分誰是不可修改的? 
分析:

//  第一種:const int*p             //  第二種:int  const *p   //  第三種:int* const p            
//  第四種:const int * const p 12341234

第一種情況:const int*p

const 後面是int*p; int*p是一個整體,是指針指向的變量,所以const 修飾指針指向的變量 
第二種:int const *p 
const 後面是 *p; *p是指針指向的變量,所以const修飾指針指向的變量

第三種:int* const p

const 後面是 p,p是指針,所以const修飾的是指針本身,而不是它所指向的變量

第四種:const int * const p 
先看第二個const得知修飾的是指針,再來看第一個const,和第一種一樣了,修飾的指針指向的變量。

學會一步一步的分析,從關鍵字出發,一步一步來。 
const 修飾的變量可以通過指針來修改

const int a = 10;int * p = &a;*p = 20;printf(" a = %d\n",a);12341234
const修飾的指針如何修改?int a = 1;int b = 2;int * const p = &a;//p = &b;   //直接修改肯定會出錯,那怎麼辦?//修改const變量是通過指針,那再通過指針修改指針行不行呢?int a = 1;int b = 2;int **test;int * const p = &a;
test = &p;
*test = &b;
printf("*p = %d\n",*p);     ////*p = 0000000000000002
                            //指針從原來的指向a,變成了現在指向的b123456789101112131415123456789101112131415

總結: 
這裏用到了二級指針,瞭解爲主,後面我們會深入研究的。這節課的重點是搞清const 與指針的用法,能夠區分const修飾的是誰就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章