天天看點

區分指針常量與指向常量的指針

首先解釋一下什麼是指向常量的指針:

顧名思義,該指針指向的是一個常量,即不能通過該指針修改其所指對象的值。要想存放常量對象的位址,隻能使用常量指針。下面給出例子:

const double pi=3.14; //pi是個double型常量,它的值不能被改變
double *ptr=π      //錯誤:ptr是一個普通指針,不能存放常量對象的位址
const double*cptr=π//正确:cptr可以指向一個雙精度常量
*cptr=42;             //錯誤:不能通過常量指針修改其所指向的對象
           

注意:指針的類型必須與其所指對象的類型一緻,但是有兩個例外。第一種情況是允許令一個指向常量的指針指向一個非常量的對象:

double dval=3.14;  //dval是一個雙精度浮點數,它的值可以改變
cptr=&dval;        //正确:但是不能通過cptr改變dval的值
           

類似于常量引用,指向常量的指針并沒有規定其所指的對象必須是一個常量。所謂指向常量的指針,僅僅要求不能通過該指針改變對象的值,而沒有規定那個對象的值不能通過其他途徑改變。

其次解釋一下指針常量:

指針是對象,是以允許把指針本身設定為常量。指針常量必須初始化,而且一旦初始化完成,它的值就不能被改變了。把*放在const關鍵字之前用以說明指針是一個常量,它意味着,不變的是指針本身而不是指向的那個值。下面是代碼示例:

int errNumb=0;
int *const currErr= &errNumb;    //curErr将一直指向errNumb
const double pi=3.1415926;      
const double*const pip= π     //pip是一個指向常量對象的常量指針
           

指針本身是一個常量也可以通過指針修改其所指向對象的值,能否這樣做完全依賴于其所指對象的類型。例如,pip是一個指向常量的指針常量,則不論是pip所指的對象值還是pip自己所存儲的那個位址都不能改變。相反的,curErr指向的是一個非常量整數,那麼完全可以用curErr去修改errNumb的值。

綜上所述,指向常量的指針不能通過指針修改其所作用對象的值;指針常量初始化後不可以改變其本身所存儲的位址,也就是不能再讓它指向其他對象。

繼續閱讀