C++语言规范:const修饰的是离它最近的类型
1、const修饰*p
const int *p = &a;
int const* p =&a;
离const最近的类型是int,所以const修饰的是*p,现在*p是一个常量,所以 *p=20 是不能编译通过的,也就是指针的指向是不能被改变的,而指针本身是可以被改变的,也就是说p=&b是可以编译通过的,因为p本身并没有被const修饰而不能作为左值。
结论:const修饰*p,指针本身可以指向不同的int类型的内存,但是不能通过指针简介修改指向的内存的值。且const int *p = &a;和int const* p =&a;表示意思是一样的。
2、const修饰p
int *const p = &a;
离const最近的类型是int * ,所以const修饰的是p指针本身,所以p=&b是不可以的,但是*p=20是可以的。
结论:这个指针p现在是常量,不能在指向其他内存,但是可以通过指针解引用修改执行的内存的值也就是*p是可以被修改的,p不能被修改。
3、const修饰p和*p
const int *const p = &a;
前一个const修饰了*p且不能被修改,后一个const修饰了p也不能被修改。
结论:指针本身以及指针所指向的内存都不可以被修改。