const int *p 与 int const* p 和const int const *p区别

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

发布了4 篇原创文章 · 获赞 1 · 访问量 2942

猜你喜欢

转载自blog.csdn.net/qq_28816873/article/details/103928206