关于常量指针和指向常量的指针的一点说明

近日笔者在中文网络搜索常量指针这一词条时,发现很多解释(说明)完全弄反了,故结合《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》,故以上内容皆以该书为准,如有错误,还请指教。

原创文章 7 获赞 7 访问量 346

猜你喜欢

转载自blog.csdn.net/Love_Point/article/details/104731534