常量指针和指针常量这两个名词虽然非常绕嘴,不过说的非常准确。用中国话的语义分析就可以很方便地把三个概念区分开。
一) 常量指针。
常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量)。
指针指向的对象是常量,那么这个对象不能被更改。
在C/C++中,常量指针是这样声明的:
1)const int *p;
2)int const *p;
常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。
二) 指针常量
指针是形容词,常量是名词。这回是以常量为中心的一个偏正结构短语。那么,指针常量的本质是一个常量,而用指针修饰它,那么说明这个常量的值应该是一个指针。
指针常量的值是指针,这个值因为是常量,所以不能被赋值。
在C/C++中,指针常量这样声明:
int a;
int *const b = &a; //const放在指针声明操作符的右侧
只要const位于指针声明操作符右侧,就表明声明的对象是一个常量,且它的内容是一个指针,也就是一个地址。上面的声明可以这么读,声明了一个常量b,它的值是变量a的地址(变量a的地址,不就是指向变量a的指针吗)。
因为指针常量是一个常量,在声明的时候一定要给它赋初始值。一旦赋值,以后这个常量再也不能指向别的地址。
虽然指针常量的值不能变,可是它指向的对象是可变的,因为我们并没有限制它指向的对象是常量。
举例代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int x=3,y=5,z=6;
const int *p=&x; //p定义为常量指针,指向值不可修改的常量x;
int *const q=&y; //q定义为指针常量,其指向不能改变
printf("%d %d\n",x,y);
printf("%d %d\n",*p,*q);
//(*p)++; //(*p)是一个常量,不能修改
p=&z;
(*q)++;
//q=&z; //q是指针常量,指向不能修改
printf("%d %d",*p,*q);
return 0;
}
将第12行和第15行代码打开时,会报错:
程序正确的运行结果如下:
结果说明:
p的指向变为z后,*P的值为6;而(*q)++后,值由5变成6;最后程序输出 :6 6