常量指针:
const int *p = &a; 或者 int const *p = &a;
*p是常量,不能将*p作为左值进行操作。但指针p还是一个变量,它的内容存放常量的地址,所以先声明常量指针再初始化是允许的,指针也是允许修改的
int a = 0,b = 1; const int *p; // 声明常量指针p p=&a; // p指向a p=&b; // 修改指针的值p让其指向b,允许 *p=2; // 修改指针所指向的变量的值,不允许
指针常量:
int * const p = &a;
指针本身是一个常量,指针指向一个变量
即p是常量,不能作为左值进行操作,但允许修改其指向的内容,即*p是可修改的。指针常量必须在声明的同时对其初始化,不允许先声明一个指针常量随后再对其赋值,这和声明一般的常量是一样的。
int a = 0,b = 1; int *const p1 = &a; int *const p2; // 不允许,必须常量定义时必须对其初始化 p2 = &b; // 不允许,p2是指向a的常量, 不允许作为左值 *p1 = 2; // 允许, 指针指向的是一个变量, 可以修改指针*p1的值
快速记忆:
把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;