常量指针和指针常量

常量指针:

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; 

原文地址:https://www.cnblogs.com/zywu/p/5903563.html