1、指向const對象的指標;
指標指向const對象,但是指標本身是普通變數,可以修改和賦值。例如:
const int * p;
這樣定義效果和上面完全一樣:
int const * p;
這個指標p指向這樣的對象:const int,也就是說,p指向的對象是不能修改的。
*p = 23;//error: *p might be const
但是,指標p卻是可以修改的:
const int a=2;const int b=3;p = &a;p = &b;
還沒完,雖然p是指向const對象的,但是這隻是p自己認為自己是指向const對象的:
int c = 4;p = &c;//ok*p = 4;//error
這裡p指向的是普通對象,但是卻不能修改p指向的值,因為p認為自己是指向const對象,是不能修改其值的。
在實際應用中,指向const的指標常用作函數的形參。將形參定義為指向const的指標,可以確保傳遞給函數的實際對象在函數中不因為形參而被修改。
這才是重點。
但是,把一個const對象的地址賦值給一個普通的、非const對象的指標是錯誤的,這會導致編譯時間錯誤:
int * q;q = &a;// error!
2、不能使用void *指標儲存const對象的地址,而必須使用const void * 類型的指標儲存const對象的地址:
const int cu = 23;const void * p = &cu;//okvoid * q = &cu;// error
3、const指標
上面是指標可變,但是指標指向的對象不能變。
還有一種情況是指標本身不能變--const指標。
int e = 0; int * const p = &e;
可以這樣理解:從右向左,p是指向int型對象的const指標。因為指標是const的,所以任何企圖給const指標賦值的行為都導致編譯時間的錯誤:
p = p;// error, p is const
所以,必須在定義時初始化,否則以後就再也沒有機會了(編譯時間報錯:未初始化)。
但是,p指向的對象是普通的變數,可以修改:
*p = 45; //ok
4、更奇葩的:指向const對象的const指標:
const double pi = 3.14159;const double * const pi_ptr = π
這裡,既不能修改指標pi_ptr的值,也不能修改指標pi_ptr指向的對象。