以前弄不明白指针常量与常指针的区别,最近读了《C++Primer》,总算是恍然大悟,特此与大家一起分享我的收获。
这两样东西在原文中称为const pointer(指针常量)和pointer to const(指向常量的指针,简称常指针)。英文名似乎比中文翻译清晰多了,前者是一个常量,而且这个常量是指针类型;后者是一个指针,而且这个指针指向一个常量。
那么在定义的时候这两种是有区别的,它们的使用方式如下:
//const pointer(指针常量)
int x = 1;
int *const px = &x;
//pointer to const(常指针)
const double pi = 3.14159;
const double *cptr = π
可以看出,我们定义了一个整型数x,然后定义了一个指针常量px,用x的地址初始化px。这样px就是指向整型数x的指针常量,之所以称为常量,是因为不能对px赋值,用下面的代码说明这个问题。
int y = 2;
px = &y; //错误:px是常量,不能对常量赋值
*px = y; //正确:可以给px指向的对象赋值,这种情况下不会改变px的值,只是改变px指向的对象的值
然后我们来看常指针的使用方式。我们定义了一个浮点型常量pi,然后定义了一个常指针cptr,用pi的地址初始化cptr。这样cptr就是指向浮点型常量pi的指针,因此称为常指针(有人也称为常量指针,是同一个意思)。我们再写一段代码说明常指针的使用。
double d1 = 1.414;
const double d2 = 1.414;
cptr = &d1; //错误:cptr只能指向浮点型常量
cptr = &d2; //正确:d2是浮点型常量
好了,到此这两种指针应该是说清楚了。
等等,,,好像还有一种指针,叫做......
常指针常量
擦擦擦,好拗口(其实是我自己想出来的名字,用英文讲就是const pointer to const)
再写一个例子
//const pointer to const(常指针常量)
const char c = 'a';
const char *const pc = &c;
我们定义了一个字符常量c,然后定义一个常指针常量pc,并用c的地址初始化pc。这样pc就是指向字符常量c的常量指针,什么意思呢,看下面的情况。
const char c2 = 'c';
pc = &c2; //错误:pc是常量,不能给常量赋值
*pc = c2; //错误:*pc是常量,不能给常量赋值
这样一来,pc和*pc都是常量,不能有任何改动。这种类型好像应用不多。。。。
哎呀,两个指针就写了这么多,其实还有常引用也是值得讲的东西,下次再说吧。
请大家积极反馈