在C++中,经常容易忘记const int *a和const *int a的区别,其实主要是看const后面修饰的是哪一个类型,以离const最近的为基准即可。
const int *a
离const
最近的是int
,const
修饰的是int
,而int
声明一个整型变量。等价于int const *a
。
所以const int *a
表示声明一个指向常量整数的整型指针a
。a
指针本身可以被修改,但是a
指向的整数不能被修改。
const int *a = 0;
const int b = 1;
int c = 2;
a = &b; // 正确,因为b是常量整数
a = &c; // 正确,这里c隐式转换为常量整数
*a = 10; // 编译错误,因为*a表示a指针指向的整数,是常量不能修改
int const *a
const
这里修饰的是*a
,而*a
表示取a
指针指向的值,为一个整数且为常量。该写法和const int *a
等价。
int *const a
这里const
后面是a
,const
修饰的是a
,而a
表示指针变量名。
所以int *const a
表示声明一个整型的常量指针变量。a
指针本身不能被修改,但是a
指向的整数可以被修改。
int a = 0;
int *const b = &a; // 正确。常量定义是必须初始化
*b = 2; // 正确,指针指向的值可以被修改
const int c = 10;
b = &c; // 错误,指针b不能被修改赋值为其他地址
const int const *a
const int const *a
表示a
指针不能被修改,同时a
指向的整数也不能被修改。还可以写成:const int * const a
。
补充
const int a
和int const a
等价,都声明一个整型常量- 常量对象的地址只能赋值给指向常量对象的指针
- 非常量对象的地址可以赋值给指向常量对象的指针
- 常量定义是必须被初始化,因为常量不能被修改
- 指向常量的指针常用于作为类成员方法或者函数参数,使用引用传递的同时,保证引用参数不被修改