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;