这两个概念经常分不清,今天好好总结一下。
一、指针常量
先说指针常量,是因为它和我们常用的数组有关系。
指针常量的声明
int * const p;
指针声明操作符*在常量限定符const前面,叫做指针常量。忽然发现了一点规律^_^。
const限定符修饰的是指针。数组名就是一个指针常量。而数组名和指针有什么区别呢?可以通过引用数组名去修改指向的内存,但是自身不可以被赋值,不可以进行++、–操作。
二、常量指针
常量指针的声明
const int * p1;
int const * p2;
常量限定符const在指针声明操作符*前面,叫做常量指针。
const修饰的是指针指向的内存地址。常量指针和上面的指针常量在赋值行为上相反。自身可以被赋值,支持++、–操作,但是不可以通过指针的引用去修改指向的内存。
总结:记住“数组名就是指针常量”,这个蛋疼的问题就算解决了。
注:
Peter van der Linden写的《expert C programming》在第69页提到const和volatile的优先级:
If a const and/or volatile keyword is next to a type specifier (e.g. int, long, etc.) it applies to the type specifier. Otherwise the const and/or volatile keyword applies to the pointer asterisk on its immediate left.
而徐波前辈翻译时在第64页写到:
如果const和(或)volatile关键字的后面紧跟…
从常量指针的声明可以看出const只要和类型说明符相邻,则const就作用于类型说明符。所以next to在此应译作在…旁边。