C 的頂層const和底層const

2021-08-29 18:22:25 字數 1962 閱讀 4330

指標如果新增const修飾符時有兩種情況:

1指向常量的指標:代表不能改變其指向內容的指標。宣告時const可以放在型別名前後都可,拿int型別來說,宣告時:const int和int const 是等價的。宣告指向常量的指標也就是底層const,下面舉乙個例子:

int num_a = 1;

int const *p_a = &num_a; //底層const

//*p_a = 2; //錯誤,指向「常量」的指標不能改變所指的物件

注意:指向「常量」的指標不代表它所指向的內容一定是常量,只是代表不能通過解引用符(操作符*)來改變它所指向的內容。上例中指標p_a指向的內容就不是常量,可以通過賦值語句:num_a=2;  來改變它所指向的內容。

2指標常量:代表指標本身是常量,宣告時必須初始化,之後它儲存的位址值就不能再改變。宣告時const必須放在指標符號*後面,即:*const 。宣告常量指標就是頂層const,下面舉乙個例子:

int num_b = 2;

int *const p_b = &num_b; //頂層const

//p_b = &num_a; //錯誤,常量指標不能改變儲存的位址值

其實頂層const和底層const很簡單,乙個指標本身新增const限定符就是頂層const,而指標所指的物件新增const限定符就是底層const。 

為啥非要區分頂層const和底層const呢,根據c++primer的解釋,區分後有兩個作用。

1 執行物件拷貝時有限制,常量的底層const不能賦值給非常量的底層const。也就是說,你只要能正確區分頂層const和底層const,你就能避免這樣的賦值錯誤。下面舉乙個例子:

int num_c = 3;

const int *p_c = &num_c; //p_c為底層const的指標

//int *p_d = p_c; //錯誤,不能將底層const指標賦值給非底層const指標

const int *p_d = p_c; //正確,可以將底層const指標複製給底層const指標

2 使用命名的強制型別轉換函式const_cast時,需要能夠分辨底層const和頂層const,因為const_cast只能改變運算物件的底層const。下面舉乙個例子:

int num_e = 4;

const int *p_e = &num_e;

//*p_e = 5; //錯誤,不能改變底層const指標指向的內容

int *p_f = const_cast(p_e); //正確,const_cast可以改變運算物件的底層const。但是使用時一定要知道num_e不是const的型別。

*p_f = 5; //正確,非頂層const指標可以改變指向的內容

cout << num_e; //輸出5

說了這麼多,應該練習一下,const int *const*const* pppi 是頂層const還是底層const?

答案當然是底層const,因為int前面const限定符,而最後乙個*後面沒有const限定符。看最後乙個例子:

const int a = 1;  

//int * pi = &a; //錯誤,&a是底層const,不能賦值給非底層const

const int * pi = &a; //正確,&a是底層const,可以賦值給底層const

const int *const *const ppi = &pi //即是底層const,也是頂層const

const int *const *const *pppi = &ppi; //底層const

C 頂層const和底層const

當我們定義指標和變數的時候,有時候希望定義成const型,就是不希望程式中改變自己定義的變數,一旦有 試圖改變定義好的const型的變數,在編譯的時候就會直接報錯。指標本身也是乙個變數物件,指標所指的變數也是乙個變數物件。當定義const int p i的時候是指標不可變還是變數i不可變呢?這就涉及...

C 頂層const和底層const

頂層const表示物件本身是乙個常量 底層const表示不能通過指標或引用改變所指向的物件 例如const int a 42 頂層const,不能改變a的值,int只能有頂層const 指標 int b 12 const int b1 b 底層const,不能通過b1改變a的值,可以理解為b1指向c...

頂層const和底層const

頂層const 本身是乙個常量 底層const 所指的物件是乙個常量 int const p1 i const修飾p1,p1本身是乙個const,所以這個const是頂層const const int ci 42 const修飾ci,ci本身是乙個const,頂層 const int p2 ci c...