先從const int i提及。使用const修飾的i咱們稱之爲符號常量。即,i不能在其餘地方被從新賦值了。注意:const int i與int const i是等價的,相同的,即const與int的位置無所謂。指針
一、const 若是在*的左邊,如const int* p = ...; const修飾的是整個*p(注意,是*p而不是p),因此*p是常量,是不能被賦值的。可是p所指向的內容是常量,指針自己是能夠改變的,注意這裏*p和p不同。code
表示p指向const類型的對象(其實也能夠指向非const對象,可是反過來非const指針不能指向const對象,緣由很簡單我定義一個類型就是不想他的值,假若讓一個非const指針能夠指向他那麼豈不是能夠經過這個指針修改它的值了?),根本目的在於爲了避免能夠經過p改變p所指對象的值例如: 對象
int i=0,j=0; const int *pi=&i;//這裏就是const指針指向非const對象 i=2;//ok i是非const 值能夠改變 *pi=3;//錯誤pi是指向const對象的指針不可經過它改變指向對象的值 pi=&j;//ok,p是指向const類型的指針,而自己不是const指針,能夠改變指向
二、const 若是在*的右邊,如int* const p = ...; 那麼p這個指針自己是常量,但內容是能夠改變的,也就是說此時p的值不能被賦值修改了,只能永遠指向初始化時候的內存地址。相反,可用*p修改i1的值了。內存
int i=0,j=0; int * const p=&i;//ok定義時初始化 *p=1;//ok,p不是指向const對象的指針 p=&j;//錯誤,由於p已經指向i了不能更改指向了
三、若是寫成這樣:const int* const p = ...;
那麼p這個指針自己,以及它所指向的內容都是不能改變的。co
四、補充錯誤
補充 const int i1=40; int *p; p=&i1; //提示錯誤,沒法從const int轉爲int。 ---------------------------------------- const int i1=40; const int *p; p=&i1; //兩個類型相同,能夠這樣賦值。