##首先快速複習一些基礎。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是「指向常量的常量指針」。