「C/C++ 01」volatile关键字 和 修改const修饰的变量

目录

一、修改const修饰的局部变量

二、无法修改const修饰的全局变量

三、volatile关键字

面试题】



一、修改const修饰的局部变量

可以通过指针和强转来修改const修饰的局部变量。

#include <iostream>
using namespace std;int main(void)
{const int a = 1;int* pa = (int*)&a;*pa = 2;cout << a << endl;return 0;
}

        以上面的案例来讲const修饰的局部变量a会在编译时进行类似宏替换的预处理(编译器把代码中的局部变量a全都替换为常量1)。但局部变量a仍然存在栈上,a也仍然是一个变量,我们通过强制类型转换把a空间的访问权限扩大后让指针变量pa指向这个空间,此时我们就能通过pa来修改a指向的空间了。

        但是上面代码的结果仍然是1,原因开头就说了:const修饰的局部变量a会在编译时进行类似宏替换的预处理,在运行前代码中的a就被宏替换为了1,所以即使a中的内容已经被修改,答应结果还是为1 。

通过反汇编可观测到这一现象:

二、无法修改const修饰的全局变量

        const修饰的全局变量则更为特殊:它在全局(静态)区中的常量区中。这是一块不允许修改的空间,我们通过指针和强转,让指针变量p指向了这块空间,我们能访问到它,但是不能修改它。


        const 修饰的全局变量是常量,放在常量区中,这是一块不能被修改的区域。而非const修饰的全局变量在全局区中,该区域允许被修改。

三、volatile关键字

        volatile 是 C 和 C++ 中的一个关键字,它告诉编译器不要对该变量的访问进行优化,并且每次对该变量的读写都应该直接从其内存地址中进行。


举个例子:volatile可以阻止编译器在编译时对const修饰的局部变量进行类似宏替换的预处理。所以下面的代码结果和一中代码的结果不一样:

int main()
{volatile const int a = 1;int* pa = (int*)&a;*pa = 2;cout << a << endl;return 0;
}

通过反汇编也能观察到,a未进行类似宏替换的预处理:

面试题】

以下代码的运行结果是?

#include <iostream>
using namespace std;int main(void)
{const int a = 100;int* p = (int*)(&a);*p = 200;cout << "a = " << a << ", *p = " << *p << endl;cout << "&a:" <<   (int*)& a << endl;cout << "p:" << p << endl;return 0;
}
  • A. 编译或者运行阶段报错
  • B. a = 100, *p = 100
  • C. a = 200, *p = 200
  • D. a = 100, *p = 200
  • E. a = 200, *p = 100

        答案是D,因为代码中的变量a在编译阶段进行类似宏替换的预处理,被替换为1 。而p通过指针+强转强制访问并修改了a所在的空间的内容。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1410511.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

hive表基本语法

hive表基本语法 青少年是一个美好而又是一去不可再得的时期 是将来一切光明和幸福的开端 目录 hive表基本语法 1.ROW FORMAT用法 2.LOCATION用法 3.EXTERNAL用法 &#xff08;外部表&#xff09; 4.STORED AS 用法&#xff1a;设置数据存储格式 5.TBLPROPERTIES 用法 6.P…

.位运算.

本题涉及到计算机组成与原理的相关知识 找了一篇相当不错的讲解&#xff0c;大家可以借鉴&#xff1a;位运算&#xff1a;按位与、按位或、按位异或、按位左移、按位右移-CSDN博客 给定一个长度为 n&#x1d45b; 的数列&#xff0c;请你求出数列中每个数的二进制表示中 11 的…

设计模式: 工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…

网络架构建模:一个云案例研究-文章翻译

网络架构建模:一个云案例研究 摘要 互联网支持广泛服务的能力取决于网络架构以及未来网络所需的理论和实践创新。本文中的网络体系结构指的是计算机网络系统的结构及其物理组件、配置和通信协议之间的交互。多年来,人们对网络架构进行了各种各样的描述,其中有大量的表面图…

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…

Linux下top命令指标说明

目录 Linux下top命令指标说明1. 概览2. CPU利用率3. 内存利用率4. 进程信息 Linux下top命令指标说明 在Linux系统中&#xff0c;top 命令是一个用于实时监视系统运行状态的工具。通过 top 命令&#xff0c;我们可以了解系统的负载情况、CPU利用率、内存使用情况以及各个进程的…

免费开源语音克隆-GPT-SoVITS-WebUI只需 5 秒的声音样本

语音克隆-GPT-SoVITS-WebUI 强大的少样本语音转换与语音合成Web用户界面。 功能&#xff1a; 零样本文本到语音&#xff08;TTS&#xff09;&#xff1a; 输入 5 秒的声音样本&#xff0c;即刻体验文本到语音转换。 少样本 TTS&#xff1a; 仅需 1 分钟的训练数据即可微调模型…

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

夸克网盘批量转存分享查询软件

夸克网盘批量转存分享软件&#xff0c;未解决批量转存困难问题以及批量分享困难问题&#xff0c;故研发此软件&#xff0c;无任何广告。 支持功能 夸克文件目录查询 自定义分页页码&#xff0c;分页数量 批量转存夸克文件 批量分享夸克文件 自定义导入夸克链接 使用教程…

四川景源畅信:抖音小店怎么运营?

在信息爆炸的今天&#xff0c;抖音小店凭借其便捷的操作和庞大的用户基础&#xff0c;成为了众多创业者和品牌商的新宠。如何运营好一个抖音小店&#xff0c;成为了许多商家亟待解决的问题。接下来&#xff0c;我们将从四个不同的方面&#xff0c;深入探讨抖音小店的运营之道。…

Android14之解决报错:libncurses.so.5与libtinfo.so.5缺少问题(二百零九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

linux实验小结

题目&#xff1a; 添加一个用户 loutest&#xff0c;使用 sudo 创建文件 /opt/forloutest&#xff0c;设置成用户 loutest 可以读写。截图 并把操作过程写入实验报告。 提示:如何创建一个文件呢?可以考虑 touch 命令&#xff0c;执 行 sudo touch /opt/forloutest 这个命令可…

Unreal 编辑器工具 批量重命名资源

右键 - Editor Utilities - Editor Utility Blueprint&#xff0c;基类选择 Asset Action Utility 在类默认值内&#xff0c;可以添加筛选器&#xff0c;筛选指定的类型 然后新建一个函数&#xff0c;加上4个输入&#xff1a;ReplaceFrom&#xff0c;ReplaceTo&#xff0c;Add…

Android手写自己的路由SDK

实现自己的路由框架 ​ 在较大型的Android app中常会用到组件化技术&#xff0c;针对不同的业务/基础功能对模块进行划分&#xff0c;从上到下为壳工程、业务模块、基础模块。其中业务模块依赖基础模块&#xff0c;壳工程依赖业务模块。同级的横向模块&#xff08;比如多个业务…

【数据库主从架构】

【数据库主从架构】 1. 什么是数据库的主从架构1.1 主从复制1.1.1 MySQL的主从主从复制技术三级目录 1. 什么是数据库的主从架构 随着公司业务线的增多&#xff0c;各种数据都在迅速增加&#xff0c;并且数据的读取流量也大大增加&#xff0c;就面临着数据安全问题&#xff0c;…

用栈实现队列——leetcode刷题

题目要求我们只用栈的基本操作 push to top 入栈&#xff0c;peek from top 返回栈顶元素&#xff0c;pop from top 移除并返回栈顶元素&#xff0c;size 栈的大小&#xff0c;is_empty 判断栈是否为空&#xff0c;这几个函数来实现队列&#xff0c;也就是说&#xff0c;我们在…

25计算机考研院校数据分析 | 哈尔滨工业大学

哈尔滨工业大学&#xff08;Harbin Institute of Technology&#xff09;&#xff0c;简称哈工大&#xff0c; 校本部位于黑龙江省哈尔滨市&#xff0c;是由工业和信息化部直属的全国重点大学&#xff0c;位列国家“双一流”、“985工程”、“211工程”&#xff0c;九校联盟 、…

「笔试刷题」:最长回文子串(中心扩展算法)

一、题目 描述 对于长度为 n 的一个字符串 A&#xff08;仅包含数字&#xff0c;大小写英文字母&#xff09;&#xff0c;请设计一个高效算法&#xff0c;计算其中最长回文子串的长度。 数据范围&#xff1a; 1≤n≤1000 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复…

和丰多媒体信息发布系统 QH.aspx 文件上传漏洞复现

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

IDEA中测试时的包名问题

报错&#xff1a;Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or SpringBootTest(classes...) with your test 原因&#xff1a;&#xff08;图是别人那巴来的&#xff09;启动类所在的包名和测试类的包名不一致导致的&#xff0c;原因是…