常量指针和指针常量的区别

 

【const】:常量

【    *

区分这两者的关系有一个简单的办法,就是看const和*的顺序,如果const在*前面,那么就是常量指针,反之就是指针常量。例如【const int* p】,const在*前,所以这是个常量指针。

 

常量指针

顾名思义,就是指向常量的指针,无法通过*p的方式修改变量的值,例子如下:

int value = 20;
const int* p = &value;

*p = 40; // 错误,p是常量指针,不能通过*p的方式修改value

 

指针常量

顾名思义,指针常量就是指针本身就是一个常量,定义的时候必须赋值初始化,无法改变本身所指向的对象,例子如下:

int value = 20;
int newvalue = 40;
int* const p = &value; // 定义的时候必须初始化所指向的对象

p = &newvalue; // 错误:p是const类型,无法改变所指引的对象

双从const限定

const int* const p;

在C语言中,某些编译器会报重复定义的警告,这种用法一般是在C++中。解析该语句可以从由往左,可以拆分为两部分:

第一部分:【const p】,标记为负号X

第二部分:【const int*】

简化一下就是:const int* X

第一部分其实就是表示的一个常量,表示p是无法被改变的,而因为这是指针类型,那么就说明p是无法被改变所指引的对象的;第二部分就是一个常量指针,表示p是一个常量指针,无法通过*p改变所指引对象的值。例子:

int value = 20;
int newvalue = 40;
const int* const p = &value; // 必须赋值初始化

p = newvalue; // 错误
*p = 100; // 错误