關於const與指針搭配使用的一點記錄

const限定符指定了一個變量爲只讀變量,是不允許被改變的,因此const變量在定義時就必須初始化。
const在與指針搭配時,使用將變的複雜和微妙。簡單的說const搭配指針就會出現以下三種情況:

  • 指向const變量(對象)的指針
  • const指針
  • 指向const變量(對象)的const指針

1.指向const變量(對象)的指針
指針指向了const變量,例如 const int *ptr或者int const *ptr,這兩種寫法含義一樣,這表示const限定了ptr所指向的數據類型,而並非ptr本身。即ptr本身並不是const.可以對ptr重新賦值,無需在定義時初始化。
指向const變量的指針可以指向一個const變量,也可以指向一個非const變量,當然指針類型與變量類型要一致。不管指向了一個const變量還是非const變量,任何企圖通過這個指針去修改變量的值都會導致編譯錯誤。同時,const變量只能賦給指向const變量的指針,賦給一個普通變量也是不允許的。
如(代碼僅供理解const,不要刻意追求是否正確可執行):

const int *ptr;
int *ptr_1;
const int a=12;
const int b=13;
int c=14;
ptr=&a;/*指向const變量*/
ptr=&b;/*重新賦值指向const變量*/
*ptr=20;/*error,不能通過ptr修改*/
ptr=&c;/*重新賦值指向非const變量*/
ptr_1=&c;/*普通指針指向普通變量*/
ptr_1=&a;/*error,普通指針不能指向const變量*/

《C++ Primer》中對此有詳細的解釋,儘管不能通過指向const對象的指針去修改基礎對象,然而如果該指針指向的是一個非const對象,可以用其他方法修改所指的對象。如下的例子:

const int *ptr;
int *ptr_1;
int c=14;
ptr=&c;
printf("c=%d\n",*ptr);
ptr_1=&c;
*ptr_1=18/*通過非指向const的指針修改*/
printf("c=%d\n",*ptr);

輸出結果可以看到兩次輸出是不一樣的。對此,《C++ Primer》中說,如果把指向const的指針理解爲“自以爲指向const的指針”,這可能會對理解有所幫助。

2.const指針

int a=12;
int *const ptr=&a

這意味着ptr這個指針被定義成const變量,必須在定義時初始化,並不能重新對ptr賦值,即不能將ptr再指向其他變量。但是,*ptr=13,這樣的操作完全取決與a是不是一個const變量,在這個例子中不是,所以*ptr=13是正確的,假如a這樣定義,const int a=12,*ptr=13會導致錯誤。

3.指向const變量(對象)的const指針

const int a=12;
const int *const ptr=&a;

這就意味着ptr不能被重新賦值,因爲它是const指針,定義時需初始化;同時不能通過ptr修改a,因爲a也是const變量。

4.有趣的typedef

typedef string *pstring;
const pstring cstr;

這時,cstr是一個指向string類型的const指針,而不是一個指向const string的普通指針。因爲const pstring cstr;,const修飾的是pstring這個類型,而這個類型是一個string指針。其實:

string s;
typedef string *pstring;
/*以下三個定義相同,都是指向string的const指針*/
const pstring cstr1=&a;
pstring const cstr2=&a;
string *const cstr3=&a;

5.記憶方法
記憶方法其實很簡單,只需看清const和*的位置就可以,const在前,則是指向const變量的指針,如:

const int *ptr;int const *ptr;

*在前,則是const指針,如:

int *const ptr;

兩個const,則是指向const的const指針了,如:

const int *const ptr;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章