[C++] const與指針的關係

##首先快速複習一些基礎。spa

考慮下面的聲明兼定義式:

int p = 10;指針

p的基礎數據類型是int。code


考慮下面的聲明兼定義式:

const int a = 10;對象

a的基礎數據類型是int,a是一個常量對象,因此必須在聲明時初始化。ip


考慮下面的語句:

const int a = 10; int *ptr = &a;編譯器

錯誤,不能將整型指針指向整型常量對象。pip

const int* ptr = &a; //正確!編譯

  注意,指針的左側如有const修飾符,則稱它爲「指向常量的指針」。顧名思義,當你聲明並初始化了這樣的指針,編譯器便默認該指針指向的是「一個常量」。爲何這裏的「一個常量」要打雙引號呢?由於其實所謂的「指向常量」只是該指針「本身認爲」的,實際上你能夠將「指向常量的指針」指向一個很是量對象,好比:class

double x = 10.1; const double* ptr = &x;基礎

在這裏,ptr這個「指向常量的指針」覺得本身指向的是一個常量,實際上操做者能夠本身對x進行隨意賦值,只是不能用ptr指針對x進行修改罷了。

Hint: 形如const type*的指針的特色是不能改變所指對象的值


考慮下面的聲明兼定義式:

double num = 1.1; double* const ptr = #

  注意,該指針的右側有const修飾符,則稱它爲」常量指針」。   如何理解呢?若是說「指向常量」表明該指針指向的是一個「常量對象」,那麼「常量指針」表示該指針自己的值是一個不變的常量。

  建議習慣從右往左理解聲明式的意義。例如double* const ptr = #,從左往右,const ptr咱們可知ptr自己是一個常量對象,而 *const ptr則表示ptr是一個「常量指針」,左側的double代表了它所指對象的基礎數據類型。

  指針儲存的值是什麼呢?固然是所指對象的地址。因此,更具體的理解即是,「常量指針」聲明時必須初始化並獲得一個對象的地址,因爲該指針自己的值,也就是所指對象的地址是不能改變的.

  因此「常量指針」一旦指向了某個對象便必須永遠指向它,相似下面的語句是非法的:

double num = 1.1; double num2 = 1.2; double* const ptr = # ptr = &num2: // invalid!!!


考慮下面的聲明兼定義式:

int m = 10;

const int* const pip = &m;

  綜合上面的敘述,相信這個表達式已經難不倒你了。

  從右往左閱讀,const pip表示pip是一個常量對象,int* const pip表示pip是一個int型的常量指針,再加上左側的const表示pip指向「一個常量」。綜合起來,就是pip是「指向常量的常量指針」。

相關文章
相關標籤/搜索