首先指出乙個錯誤,壓根就不應該有指標常量這個說法。
經常聽到有關常量指標和指標常量的討論,也經常見到有關兩者區別的文章,然而,有些文章卻誤導了讀者,他們的結論根本就是錯的。
例如關於指標常量和常量指標的討論,結果完全顛倒了;
而其他一些文章呢,充其量只是火上加油,讓本來就很複雜的事情變得更加難於理解,例如
有些觀點甚至是錯的,的這篇文章(倒也中規中矩,然而又稍顯簡單。
其實歸根結底,問題在於我們自己製造了一些名詞,本意是為方便,結果卻帶來更大的麻煩。
我查了一下《c++ primer》第三版中文版,
常量指標出現過四次左右,而指標常量沒有出現過。
這也就是說,
指標常量根本就不應該是乙個學術術語,而是我們杜撰的。
從英文的翻譯來看,事實也是如此。關於指標和常量,有兩種說法,const pointer和pointer to const,亦即常量指標和指向常量的指標,根本就沒有pointer const這樣的說法,也就是所謂的指標常量的說法出現,而且pointer const在英語中也絕不可能出現。
中文中出現指標常量的原因,估計一是因為常量指標(const pointer)的存在,一是因為方便,而前者的影響應該是最主要的。本意是為了讓他們相似,便於比較,沒想到卻搬起石頭砸了自己的腳,得不償失。
關於常量指標和指向常量的指標,我想應該是很好區別的。
而指向常量的指標,文如其義,自然就是指標說指的物件是乙個常量,該物件的值不能修改。
知道了他們的意思以後,遇到宣告時,我們就可以按照上面說的方法來判斷何為常量指標,何為指向常量的指標了。為方便,我將該文的觀點引述如下:
bjarne在他的the c++ programming language裡面給出過乙個助記的方法:把乙個宣告從右向左讀(這可能和我們平常習慣有所不同,需要特別注意,但這應該是遵循修飾符的優先順序)。
char * const cp; (* 讀成 pointer to)
cp is a const pointer to char ,亦即指標常量,cp值不可改變,但*cp,也就是cp所指物件能夠改變。
const char * p;
p is a pointer to const char,亦即指向常量的指標,所以p所指的物件不可改變。
兩者的區別還是容易理解的,倒是他們的用法有些讓人費解的地方。我們看看如下的程式:
1main()
2上面的**中,你能找出多少錯誤?如果將這些出錯的語句都注釋掉,所得到的輸出結果又是什麼呢?通過程式的輸出結果,我們可以看到指向常量的指標所指向的物件值仍然有可能會改變,而通常想改變常量指標的值是很難做到的。
上面的程式經過修改後的輸出結果如下:
1520
2015
總結一下:
常量指標必須賦初值。
定義格式:資料型別 * const 常量指標 = 常量值;
舉例:
int va, vb;
int * const pint = &va;
讀法:pint是乙個指向int型別的常指標;表明pint是乙個常量指標指向變數va的記憶體;
因為指標值是常量,所以不能再用pint指向其他變數,pint = &vb;錯誤
但是可以更改指向記憶體的值,*pint = 20; *pint = 50;等。
定義格式:const 資料型別 * 指標;
或:資料型別 const * 指標;
舉例:
const int va;
int vb;
const int * pint ;
pint = &va;是對的
pint = &vb;也是可以的
但是*pint = 50就是錯誤的
讀法:pint是乙個指向const int型別的指標;
指向常量的指標所指向的內容不能被修改。 常量指標和指向常量的指標
1 常量指標 指標本身的位址值不可修改,這個值是定義指標的時候確定的,以後不可再改變。定義 int const i new int i是常量,執行i 會出錯 const修飾的是i,所以i不能變。2 指向常量的指標 該指標指向的變數是不可修改的。定義 const int i new int 100 或...
常量指標和指向常量的指標
經常c 程式設計師會提到 常量指標 const pointer 其實他們想表達的意思往往是 指向常量的指標 pointer to const 真不幸,這是兩個完全不同的概念。t pt new t const t pct pt 乙個指向常量的指標 t const cpt pt 乙個常量指標這裡一定要弄...
指向常量的指標和常量指標
指向常量的指標和常量指標 雨竹清風 指向常量的指標 是指該指標指向的是一常量,不能改變的是所指物件的值。要想存放常量物件的位址,只能使用指向常量的指標。常量指標 指的是該指標是一常量,即指標的位址不能改變。1 指向常量的指標 const int p 2.1 const double pi 3.14 ...