const与一级指针二级指针结合

举报
IM_STONE 发表于 2020/12/28 23:10:25 2020/12/28
【摘要】 const关键字在C和C++里修饰变量时,是不同的,在C++里const修饰的量是常量, 而在C里const修饰的量是常变量。关于const在C和C++里的不同我有时间再整理成另外一篇。 一、首先来确定一下到底const修饰的是谁。一句话,类型就近原则。 const int p; 此时离const最近的类型是int类型,所以const修饰的是 p,所以p不能被改变...

const关键字在C和C++里修饰变量时,是不同的,在C++里const修饰的量是常量,
而在C里const修饰的量是常变量。关于const在C和C++里的不同我有时间再整理成另外一篇。

一、首先来确定一下到底const修饰的是谁。一句话,类型就近原则。
const int p; 此时离const最近的类型是int类型,所以const修饰的是 p,所以p不能被改变;
const int * p; 此时离const最近的类型还是int类型,所以const修饰的是 * p,所以 * p不能被改变,p可以被改变;
int * const p ; 此时离const最近的类型是int*类型,所以const修饰的是 p,所以p不能被改变;;
在C++里const修饰的是常量,那么就有以下2条重要的参考规则:

**1、常量不能当作左值;
2、不允许有指针或引用可以间接改变该常量的值。**

这两条规则是我们的重要参考依据。

******const与一级指针结合:

int a=10;
const int *p = &a;此时const修饰 *p,
*p = 20;//错误,不符合规则1.(常量不能当作左值;)
int*q = p;//错误,不符合规则2(不允许有指针或引用可以间接改变该常量的值。因为此时我们可以对q解引用,来改变*p)

const与二级指针结合:参考https://wenku.baidu.com/view/bbe7e708a300a6c30c229fa1.html

const int **p ,
int **const p,
int const *p的区别 参照第一点,你能够很快区分const int **p , int **const p的区别。 const int **p 表示**p代表的整形内存放的是常量,不能被修改,而指针p本身可以被任意修改赋值。 int **const p 表示**p代表的整形内存放的是变量,可以被任意修改,而指针p本身是不能被修改的 int *const *p是什么意思呢? 由于int const p是一个二级指针,那么const现在修饰的是int,代表*p的值是不能被修改的,通俗的说,也就是二级指针p所指向的一级指针*p是不能被修改的,而**p所代表的整形内存可以被任意修改,指针p本身也可以被任意修改! 对于二级指针综合const有一个重要的问题,如下,请看示例代码:
int a=10;
int *p=&a;
const int q=&p;//error! “初始化”: 无法从“int ”转换为“const int ” 也类似于这样的代码: int *p; const int **q=p; //error! “初始化”: 无法从“int ”转换为“const int *”

可以看出,c++不让我们把int**转换为const int**,这样不好吗?我们不是把类型的安全属性提高了吗?为什么反到禁止这样的类型转换呢? 当然c++这样做是出于安全考虑的,以防止我们修改常量对象。为了展现如何会修改常量对象,在这里我们做个假设,假设c++允许我们代码“const int **q=&p”的执
行,也就是允许我们把int**转换为const int**,请看实例:

int a=10;
int *p=&a;
const int **q=&p;//假设这一行代码c++允许执行

const int b=20;
const int *pb=&b;
* q=pb;//重点在这里,由于* q(* q就是指针p)是变量,pb指针也是变量,因此把pb赋值给* q,也就等于执行了p=pb,由于pb指向的是常量b,因此指针p也指向了常量b,但是看看p的定义 int * p, 没有任何const修饰,你可以通过* p修改内存的值,但是p代表的常量b,是不能被修改的,你试图通过非常量指针p去修改常对象是错误的!编译器不会答应这样的事情!通过上面例子,你应该知道c++为什么不允许我们把int*转换为const int**,因为这样会有让一个普通指针指向常对象的危险。

文章来源: blog.csdn.net,作者:IM-STONE,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/doubleintfloat/article/details/78460091

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。