天天看點

const指針的了解

const指針

有點複雜啊,一系列const組合起來。看的人頭都大了!但總的來說,想要存放常量對象的位址,隻能使用指向常量的指針

const double pi = ;     // pi是個常量,它的值不能改變
double *ptr = &pi          //錯誤:ptr是一個普通指針
const double *cptr = π     //正确:cptr可以指向一個雙精度常量
*cptr = ;                         //錯誤:不能給*cptr指派
           

這裡要差別一下下面的,這裡的cptr可以改變指向,但是不能改變其指向的值。因為值被前面的const限定了。

指針const

這個不一樣,從标題可見是指針在前const在後,但是與上面的有什麼差別呢?

指針是對象而引用不是,是以就像其他對象類型一樣,允許把指針本身定為常量。常量指針必須初始化,而且一旦初始化完成,則它的值(也就是存放在指針中的那個位址)就不能在改變了。把*放在const關鍵字之前用于說明指針是一個常量,這樣的書寫形式隐含着一層意味,即不變的是指針本身的值而非指向的那個值:
int errNumber = ;
int *const cureErr = &errNumb;                 //curErr将一直指向errNumb(那麼可以通過該指針修改這個值嗎?)
//答案是可以,const隻限定了指針指向的位置,沒有限定所指向的值
const double pi = ;
const double *const pip = π               //為什麼這裡前面加了const呢?因為該指針指向的是一個const變量(const double)
           

就像之前說的,從右向左閱讀,此例中,離curErr最近的符号是const,意味着curErr本身是一個常量對象。

總結一下

int pi = ;
int p2 = ;
const int ppi = ;
           
  • const int *p = &pi,指針指向的位址可以改,但是不能通過指針修改指針所指向的值,比如 p = &p2。
  • int *const p = &pi,指針指向的位址不可以改,但是可以通過指針修改指針指向的值,比如*p = 1。
  • const int *const p = &ppi;,指針指向的位址不可以改,也不能通過指針修改指向的值。

const的右邊是誰,則誰不能變

比如const的右邊是int,則不能改變int值;cosnt的右邊是p,且p是一個指針,那麼不能改變p的指向。