C++中指向常量的指標和常量指標
阿新 • • 發佈:2019-02-18
1 指向常量的指標
指向常量的指標表示該指標中存放的是常量的地址。例如
const int value = 3;
const int* ptr = &value;
其中,&value即ptr中存放的地址如圖1所示。
圖1 ptr中存放的地址
根據圖1的值,ptr和value的關係如圖2所示。
圖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所示。
圖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;