常量指针与指针常量是两个很容易被混淆的概念,他们的核心是const关键字,const限定一个变量不允许被改变。const在一定程度上可以提高程序的安全性和可靠性。
一、常量指针
顾名思义,是一个被常量修饰的指针,意味着const去修饰一个*p,所以常量指针的本质是指针,表示这个指针时一个指向常量的指针,因此指针指向的空间中的内容是不能改变的。指针常量通常的书写格式如下:(两种格式等价)
1)const int *p;
2)int const *p;
注:使用常量指针时要注意,指针指向空间的内容不可以通过指针来改变,但是可以使用原来的声明去改变。但是这个指针可以被改变。如下:
const int a = 1;
const int b = 2;
const int *p1 = &a;
p1 = &b; // 虽然指针指向的常量不可以被改变,但是指针本身可以重新指向其他地址。
根据以上特性,指针常量可以不在初始化时赋值。而常量必须在初始化时赋值。
因此常量指针在区分时,*与变量之间是不会存在const的,即*左边永远有const。
二、指针常量
指针常量,指针来形容常量,顾名思义,指针常量本质为常量,说明这个常量的值是一个指针。它的表现形式如下:
int a = 1;
int * const p = &a;
如上所示,p是一个常量,它存放的是&a的值,也就是a的地址,那么由于const p 的特性,所以指针常量中p的值不会改变,因此指向的对象不能更改,但是这个对象是可以被任意修改的。
三、指向常量的常量指针
综合以上两个概念,就可以产生一个指向常量的常量指针,表现形式如下:(两种方式等价)
const int a = 1;
const int b = 2;
const int * const p1 = &a;
int const * const p2 = &b;
如上,一个常量指针被const所修饰,首先说明了p1的值不会被改变,同时,该指针指向的对象也不会改变。因此这是一个从指向空间与空间内的对象都被限制的定义。