const修饰指针,一般分为如下四种情况:
int b = 500;
const int *a = &b; //情况1
int const *a = &b // 2
int* const a = &b // 3
const int* const a = &b// 4
如何区别呢?
1)先看情况1。
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常
量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,1和2的
情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下
不允许对内容进行更改操作。
换句话来说,如果a是一名仓库管理员的话,他所进入的仓库,里面的货物(*a)是他没权
限允许动的,仓库里面的东西原来是什么就是什么;所以
int b = 500;
const int* a = &b;
*a = 600; //错误
但是也有别的办法去改变*a的值,一个是通过改变b的值:
int b = 500;
const int* a = &b;
b = 600;
cout << *a << endl //得到600.
还有一种改变*a办法就是a指向别处(管理员换个仓库):
int b = 500, c = 600;
const int*a = &b;
a = &c;
cout << *a << endl //得到600
对于情况1,可以先不进行初始化。因为虽然指针内容是常量,但指针本身不是常量。
const int* a; //正确
2)情况2与情况1相同。
3)情况3为指针本身是常量,这种情况下不能对指针本身进行更改操作,而指针所指向
的内容不是常量。
举例来说:如果a是一名仓库管理员的话,他只能进入指定的某仓库,而不能去别的仓
库(所以a++是错误的);但这个仓库里面的货物(*a)是可以随便动的,(*a=600是正确
的)。
此外,对于情况3:定义时必须同时初始化。
int b = 500, c = 600;
int* const a; //错误,没有初始化
int* const a = &b; //正确,必须初始化
*a = 600 //正确,允许改值
cout << a++ << endl; //错误
4)对于情况4为指针本身和指向的内容均为常量。那么这个仓库管理员只能去特定的仓
库,并且仓库里面所有的货物他都没有权限去改变。