---------------------------------
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中推薦的劃線分左右法更好記。
另2:const和typedef在一起時容易讓人陷入陷阱,具體見《typedef的用途和陷阱》。
const指標和指向常量的指標
1.const int p 2.const int p 3.int const p 4.int const p 5.const int const p 6.int const const p 乙個簡便方法 從由往左讀,遇到p就替換為 p is a 遇到 就替換為 point to 其餘不變。1.co...
常量指標和指向常量的指標
首先指出乙個錯誤,壓根就不應該有指標常量這個說法。經常聽到有關常量指標和指標常量的討論,也經常見到有關兩者區別的文章,然而,有些文章卻誤導了讀者,他們的結論根本就是錯的。例如關於指標常量和常量指標的討論,結果完全顛倒了 而其他一些文章呢,充其量只是火上加油,讓本來就很複雜的事情變得更加難於理解,例如...
常量指標和指向常量的指標
1 常量指標 指標本身的位址值不可修改,這個值是定義指標的時候確定的,以後不可再改變。定義 int const i new int i是常量,執行i 會出錯 const修飾的是i,所以i不能變。2 指向常量的指標 該指標指向的變數是不可修改的。定義 const int i new int 100 或...