關於常量指針和指向常量的指針的一點說明

近日筆者在中文網絡搜索常量指針這一詞條時,發現很多解釋(說明)完全弄反了,故結合《C++ Primer》中文版(第五版)對相關名詞加以闡釋:

一、常量指針(const 指針)
指針本身是對象,故可以像其他對象類型一樣把指針本身定爲常量,即爲常量指針(const pointer)。
注意:常量指針必須初始化,而且一旦初始化完成,則它的值(即存放在指針中的地址)就不能再改變了。也就是說常量指針不變的是指針本身的值而非指向的那個值。
舉個栗子:

int a = 0, b = 1;
int *const p1 = &a; 		//初始化常量指針p1, p1將一直指向a所在的內存區域,但是不管該內存區域
						    //存的是個常量還是非常量
*p1 = &b;  				    //錯誤,p1是個常量指針,一旦初始化完成,不能修改。**
*p1 = b;  					//正確
			  				//此時a=1,b=1

二、指向常量的指針(pointer to const)
指向常量的指針不能用於改變其所指對象的值,要想存放常量對象的地址,只能使用指向常量的指針。
注意:指向常量的指針並不意味着該指針指向的是個常量對象,而是不能通過該指針改變其所指對象值,然而還可以通過其他途徑更改其所指對象值。
舉個栗子:

const int a = 5;
int *p = &a;                //錯誤,p是個普通指針
const int *ptr = &a	        //正確,ptr可以指向一個int常量 
*ptr = 8; 					//錯誤,不允許給*ptr賦值

int b = 1;
int *p1 = &b;
const int *ptr1 = &b;		//等價於int const *ptr = &b
*p1 = 2; 					//正確
*ptr1 = 2 					//錯誤,不能通過*ptr1改變b的值。

const int *const ptr2 = &a;	//ptr2是一個指向常量對象的常量指針

可以這樣想:所謂指向常量的指針,不過是指針“自以爲是”罷了,它們覺得自己指向了常量,所以自覺地不去改變所指對象的值。

三、關於指針常量
筆者並未在《C++ Primer》中文版(第五版)中找到相關說法,不過該書中有提到:

C++程序員們經常把詞組“對const 的引用”簡稱爲“常量引用”,這一簡稱還是挺靠譜的,不過前提是你得時刻記得這就是個簡稱而已。

故而筆者猜測:指針常量應該是一種習慣用語(或者其他中文意譯),其可能是本文所述的“常量指針”,而常量指針(非本文所述)的另一說法則爲"指向常量的指針"的簡稱。

四、寫在最後~
其實理解了頂層const和底層const,以上內容即會迎刃而解~
筆者初學C++,正在看《C++ Primer》,故以上內容皆以該書爲準,如有錯誤,還請指教。

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