栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++:const与指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++:const与指针

目录

const在C和C++中的区别

C方式

C++方式

 const与指针

const

指针之间的相互赋值

const在C和C++中的区别

C方式

C方式编译时

以变量为主。所以编译器会报错,原因为:为一个变量,在定义数组时n要求为一个常量,要么是#define定义的宏常量要么是enum枚举常量或者是一个具体的数值。

*p的改变改变的时n本身。

在汇编层面:到n的地址空间,把n的值给eax,再把eax的值给b,

C++方式

C++编译时:以常量为主。

在汇编层面, 

在C++中你看到的代码不是真正的代码,n是一个常变量,在编译时遇见n用5进行替换,但调试是在源码中调试,执行是在汇编机器上执行,看见的和具体执行的不是一回事。虽然在内存中通过*p把n的值变成100,但在编译的时候n不复存在,把它替换成5,把5给b,所以最后打印的结果为n=5 b=5 *p=100。

 const与指针

 

指针有两个值,一个是他自身的值,一个是他解引用后的值。p1通过解引用可以改变a的值,但是p1自身还可以指向b,p1里存放的时a的地址,解引用就是a本身

const

const int* p2 =&a;与int const* p2 = &a;这两种写法是等价的。

const在星号(*)左边,修饰的是它的指向能力,p2指向了a的地址,但由于const的修饰,通过*p2去改变a的值是不允许的。但p2本身没有被const修饰,p2本身是可以被改变的。

const在星号(*)的右边,const和变量名离得较近,修饰的是变量名。指针变量用const修饰变成了一个常性指针,所以p3自身是常性,可以对p3进行解引用,但是不能对p3进行写

 

 两个const分别修饰p4得指向能力和指针变量。说明p4自身不能变,指向能力也不能变,无法对p4进行解引用,p4自身的值也不能变,不可写但可读。封锁的是写的能力。

变量和指针之间的关系

 const int b=20;//b是一个常变量

const int* p2=&b;//p2可以指向b,但是不能修改b

指针之间的相互赋值

s指向a不能对a进行解引用,把s的值给p1时,*p1可以改变a的值,能力被扩展不安全error;p3的const修饰的是指针自身不能改变,可以通过*p3去解引用,能力被扩展不安全error。

 

 s自身不能改变,但可以改变指向。s给p1时,*p1可以改变指向的值,p1指向&b时,不会使s也指向&b,所以编译通过;p2和p1一样,多了一个指向约束,可以指向但不能改变,可以编译通过。

用常性修饰相同类型的指针时,发生的数值兼容性规则,主要的问题就是安全性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917175.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号