1. 程式人生 > >C++中指向常量的指標和常量指標

C++中指向常量的指標和常量指標

1 指向常量的指標

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

const int value = 3;

const int* ptr = &value;

其中,&valueptr中存放的地址如圖1所示。

 

1 ptr中存放的地址

根據圖1的值,ptrvalue的關係如圖2所示。

 

2 ptrvalue的關係

指向常量的指標不能用於改變其所指向物件的值。要想存放常量物件的地址,必須使用指向常量的指標。

指向常量的指標也可以儲存非常量的地址。程式碼如下所示

int value = 3;

const int* ptr = &value;

也就是說,要想改變變數value的值,只能通過

value來實現,而不能通過ptr來實現。

value = 4;//正確

*ptr = 5;//錯誤,不能給常量賦值


2 常量指標

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

int value = 3;

int* const ptr = &value;

ptrvalue的關係如圖3所示。

 

3 ptrvalue的關係

由於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提出問題”提到的程式碼中,引用型別pconst int*,而與之繫結的物件a的型別是int*,雙方型別不匹配,所以會報錯。

3.3 解決問題

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

3.3.1 型別匹配

3.2分析問題”中提到,

pa的型別不匹配。可以修改a的型別,將其變為const int*即可。

const int *a;

const int* &p = a;


3.3.2 型別轉換

2常量指標”中提到,本身是常量的指標可以指向非const物件。引用也是如此,本身是常量的引用也可以指向一個非const的物件。所以將p的型別改為常量引用也可以解決問題,程式碼如下所示

int *a;

int* const &p = a;