天天看點

c++ 常量指針 const*const

1.什麼是常量指針

我們可以使用const 來修飾指針,在用const 修飾指針時,我們可以指出,指針自身,指針所指的内容,為常量 const。當const修飾指針時,如果關鍵字const出現在 星号* 左邊 表示的是指針所指的内容為常量,如果關鍵字const 出現在星号* 右邊 表示的是指針本身為常量。如果const出現在星号*兩邊 表示 指針本身 和指針所指的内容都為常量,不能被修改。為了更清楚地說明const是如何修飾指針的,請看以下代碼

#include<iostream>
using namespace std;

//測試 const關鍵字修飾指針
int main(void){

    int a = ;//定義了一個整形變量a 并且用3來初始化變量a 這裡a的     
              //值為3
    int b = ;//定義了一個整形變量b ,用4來初始化變量 b 這裡b 
              //的值為4
    int *pa = &a;//定義了一個指向整形的指針變量pa ,pa指向a 的
                 //位址 此時pa的值為 a的位址&a ,*pa 的值為3
                 //此時因為星号*前面和後面都沒有const修飾,是以   
                 //不管是指針變量pa還是指針pa所指物都可以發生改    
                 //變


//指針本身發生改變

    pa = &b;//此時指針變量pa的指向發生了改變,把變量b的位址指派給
           //了pa 是合法的,此時pa 的值為b的位址&b,*pa 的值為   
           //變量b的值4

//指針所指的内容發生改變

    *pa = a;//此時指針變量pa的指向沒有發生改變,還是指向上一指令b
            //的位址,但是指針所指的内容已經由變量b 變為變量a 此
            //時*pa的值為變量a的值3

//const 修飾指針本身 指針本身不能發生改變,指針所指的内容可以改變 

    int* const pc = &a;//定義了一個指向整形變量的常指針pc,并且
                       //把變量a的位址&a 賦給 pc 此時 pc 指   
                       //向變量a的位址&a,*pc 的值為變量a 等
                       //于3
    //pc = &b;      //編譯器報錯,表達式必須是可修改的左值,因為               
                    //pc 為常指針,指針本身不能發生改變
    *pc = b;      //可以通過,指針pc 所指的内容是可變的,此時把 
                  //變量b 賦給 pc所指的内容,*pc 此時由a的值3
                  //變為b的值4


//const 修飾指針所指的内容,把const放在* 左邊,此時指針本身pd可以發生改變,指針所指物*pd不能發生改變

     const int * pd = &a;//定義另一個指針變量pd ,pd所指的内容*pd為常量,并且把變量a的位址&a 賦給pd ,此時指針變量pd 的值為變量a的位址&a
    //*pd = b;//編譯器報錯  “不能給常量指派”此時 指針變量pd所指的内容為常量,不能發生改變


    //const 既修飾指針本身 又修飾指針所指的内容 

     const int* const pe = &a;//此時定義了一個指向常量型的指針常量 pe ,并且把變量a的位址賦&a 指派給pe,此時無論指針pe 還是指針pe所指的内容都不能發生改變

    //pe = &b; //編譯器報錯 “表達式必須為可修改的左值” 
    // *pe = b;// 編譯器報錯 “表達式必須為可修改的左值”



    cout << *pa <<endl;




    return ;
}
           

2.怎麼使用常量指針?

因為常量定義式通常被放在頭檔案内(以便被不同的源碼引入)

,是以有必要将指針 (而不是指針所指的内容)聲明為const

如 int const b = &a;如果在頭檔案内定義一個常量(不變的量)const必須寫兩次, 如: const int const b = &a ;

繼續閱讀