天天看點

C++中指向常量的指針和常量指針1 指向常量的指針2 常量指針3 實戰

1 指向常量的指針

指向常量的指針表示該指針中存放的是常量的位址。例如

const int value = 3;

const int* ptr = &value;
           

其中,&value即ptr中存放的位址如圖1所示。

C++中指向常量的指針和常量指針1 指向常量的指針2 常量指針3 實戰

圖1 ptr中存放的位址

根據圖1的值,ptr和value的關系如圖2所示。

C++中指向常量的指針和常量指針1 指向常量的指針2 常量指針3 實戰

圖2 ptr與value的關系

指向常量的指針不能用于改變其所指向對象的值。要想存放常量對象的位址,必須使用指向常量的指針。

指向常量的指針也可以儲存非常量的位址。代碼如下所示

int value = 3;

const int* ptr = &value;
           

也就是說,要想改變變量value的值,隻能通過value來實作,而不能通過ptr來實作。

value = 4;//正确

*ptr = 5;//錯誤,不能給常量指派
           

2 常量指針

常量指針指的是指針本身是常量,不能修改該指針中儲存的位址,而該位址儲存的可以是常量也可以是變量。

int value = 3;

int* const ptr = &value;
           

ptr與value的關系如圖3所示。

C++中指向常量的指針和常量指針1 指向常量的指針2 常量指針3 實戰

圖3 ptr與value的關系

由于ptr本身是常量,是以不能對ptr儲存的值進行修改,但是可以通過ptr對其指向的變量進行修改。

*ptr = 4;//正确,此時value的值變為4

ptr = 5;//錯誤,“=”: 無法從“int”轉換為“int *const ”
           

3 實戰

3.1 提出問題

在CSDN中有朋友提到以下代碼會報錯

int *a;

const int* &p = a;
           

報錯資訊為,無法從“int *”轉換為“const int *&”。

3.2 分析問題

從以上代碼可知,變量a是一個指向int的指針;變量p是一個引用該引用指向了一個指向常量的指針。而引用是為對象起了另外一個名字,要求引用類型都要和與之綁定的對象比對。在“3.1提出問題”提到的代碼中,引用類型p是const int*,而與之綁定的對象a的類型是int*,雙方類型不比對,是以會報錯。

3.3 解決問題

可以使用兩種方法解決以上問題。

3.3.1 類型比對

在“3.2分析問題”中提到,p和a的類型不比對。可以修改a的類型,将其變為const int*即可。

const int *a;

const int* &p = a;
           

3.3.2 類型轉換

在“2常量指針”中提到,本身是常量的指針可以指向非const對象。引用也是如此,本身是常量的引用也可以指向一個非const的對象。是以将p的類型改為常量引用也可以解決問題,代碼如下所示

int *a;

int* const &p = a;