指向常量的指針 與 常量指針

 

1)先看const常量的情況:

const int a=2;
int const b=c; // c是已經聲明過的整型
兩者都可以。本地的const常量必須在第一次聲明時就初始化,用變量或常量初始化都可以,只是初始化一次以後它的值就不能再改變了,此所謂const的含義。

2)接着看指向常量的指針:

const int *pa;
int const *pa;
兩者也等價。因爲指向常量的指針有時候會指向常量,所以它具有這個性質:“不能靠解引用改變它指向的對象的值”,以此保護它所指向的常量的常量性:
*pa =d; // 不可行(d是已經聲明過的整型)

但指針本身的值是可變的:
pa=& d; // 可行(d是已經聲明過的整型)

而且指向常量的指針有時候也會指向變量,如下:
int t,u;
const int *pa;
pa =&t; //可行,指向變量t
pa =&u; //也可行,指向變量u

我們可以把它理解成:“爲了指向常量而發明的指針”,這樣比較貼切。

3)然後看常量指針的情況:

int *const pa =&n; // n是之前已經聲明過的整型變量,注意必須是變量,理由見下

 “常量指針”即指針本身的值是常量,但“能靠解引用改變它指向的對象的值”,如下:
pa=&d; // 不可行(d是已經聲明過的整型)
*pa =d; // 可行(d是已經聲明過的整型)

因爲常量指針也是一種const常量,所以它同樣必須在第一次聲明時就初始化,不過它的初始值縮小爲只能是變量(的地址),因爲只有變量才能確保以後能靠解引用而改變它指向的對象的值。這使得常量指針不象一般的const常量,用變量或常量初始化都可以。
也就是說,常量指針反而總是指向變量的。

4)最後,是前面兩者的結合:指向常量的常量指針
const int *const c=&e; //e是已經聲明過的整型,整型常量或整型變量都可以

把它理解成一個普通的const常量,同時被剝奪了“靠解引用改變它指向的對象的值”的性質的就行。

5)關於記憶技巧:
對於區分const int *pa和int *const pa這兩者,
前者中,const直接修飾*(不考慮int,因爲類型在這裏是沒影響的),說明*(解引用)這種行爲具有常量性,即“不能靠解引用改變它指向的對象的值”,即指向常量的指針。
後者中,const直接修飾pa,說明pa本身的值具有常量性,即常量指針。

或者也可以這樣來記憶:
const int a;       // const常量
const int *a; //指向常量的指針
int *const a=&n; //常量指針
你在紙上按順序寫下以上三行,記住它們的註釋長度:短——長——短,
分別對應着:const常量、指向常量的指針、常量指針這三種,應該就不會混淆了。

個人認爲以上記憶法比《Effective ++》條款21中推薦的劃線分左右法更好記。

另1:也有教材反過來把上述第二者稱呼爲“常量指針”,第三者稱呼爲:“指針常量”,相對來說更容易讓人混淆,大家還是隻記住上面的那種稱呼法就好。

另2:const和typedef在一起時容易讓人陷入陷阱,具體見《typedef的用途和陷阱》。

 

該文章摘自http://faq.csdn.net/read/217386.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章