const int * p 与 int const* p 和const int const * p区别
一、何为const
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。也就是说const常量,具有不可变性。
例如:
const int Max=100;
Max++; //操作错误
二、 指针常量与常量指针
1、指针常量
指针就是内存单元的地址,所谓指针常量,也就是这个指针变量的值不可改变,即指针只能唯一的指向一个地址,这个地址所对应的内存单元中的内容可以被修改
int* const p = &a; //指针常量
eg:
//如果不想要看到错误信息的话,注释掉#define CONFIG_DEBUG这句
#define CONFIG_DEBUG
int a, b;
int * const p = &a; // 定义了一个只能指向a的地址的指针
*p = 666; //操作成功
#ifdef CONFIG_DEBUG
p = &b; //操作失败,指向的地址不可更改
#endif
2、常量指针
顾名思义,常量指针就是指向常量的指针,只要你想让你指向的内存单元中的内容具有像常量那样的不可变性,就可以用常量指针去指向它,相比指针常量,常量指针可以指向任何类型的变量的地址。
就像给小屋(内存单元)里的东西(内容)贴了封条,屋门上上了一把锁,即便是用钥匙打开了屋门(通过指针访问内存单元内容),里面的东西也不允许再改动了。
所以其指向的内存单元中的内容不可被修改。
const int* p=&a; //常量指针
#define CONFIG_DEBUG
int a, b;
const int * p = &a; // 定义了一个常量指针
p = &b; //操作成功
#ifdef CONFIG_DEBUG
*p = 666; //操作失败,指向的地址中的内容不可更改
#endif
3、常量指针搭配指针常量
const int * const p = &a;
我们暂且先不管它叫什么名字,这种搭配就好像是
一间上了锁的房子(内存单元);
里面的东西(内存单元中的内容)被贴上封条(const性质);
这个房子的钥匙只能一个人拥有,管家也只允许拥有这一把钥匙,多了没有;(指针常量被const修饰)
也就是指针常量指向的地址不可修改,被指向的地址中的内容也不可被修改。那至于这种用法叫什么名字,我们可以叫它指向为常量的常量指针
本文参考了 https://blog.csdn.net/weibo_dm/article/details/80445205