当前位置: 首页 > news >正文

C++与C语言 通过指针改变const变量的值

一、问题描述

        当一个变量声明为const时,通常是不可以改变它的值的,程序设计过程中也不应该这么做。

const int num = 666;//我们不应该对num的值进行修改
// num = 777;  此语句是错误的

        当然,如果我们写以下语句,程序编译也会出现这样的错误

int *p = #//程序会报错:无法将"const int *"转换为"int *"

        但如果我们强制转换,就会发现程序编译通过了:

int *p = (int *)#//程序编译通过

        这种程序执行之后,通过指针p访问num直接访问num的值是怎样的呢?让我们一探究竟。

二、执行结果

        程序代码如下:(注意:C语言和C++的执行结果是不同的)

int main() {const int num = 666;int *p = (int *)num;*p = 777;printf("num : %d, *p : %d", num, *p);return 0;
}

2.1 C语言的执行结果

        我们补全C语言的代码,并将其放入一个.c文件中:

#include<stdio.h>int main() {const int num = 666;int *p = (int *)num;*p = 777;printf("num : %d, *p : %d", num, *p);return 0;
}

         我们先看程序的执行结果:

        结果显示,二者的值都被改变了。原因是C语言的const关键字为运行时const,编译期间只是定义,在运行时才会初始化。因此,这就是C语言中的const变量不能作为数组长度的原因。

2.2 C++的执行结果

               我们将以下C++代码放入一个.cpp文件中:

#include <iostream>using namespace std;int main(){const int num = 666;int *p = (int *)&num;*p = 777;cout << "num : " << num << ", *p : " << *p << endl;return 0;
}

        执行结果如下:

        我们可以看到,直接访问num的值并没有改变,而通过指针p间接访问到的值改变了,与C语言执行结果不同。因为C++的const变量为编译时const,是像#define宏定义一样使用的常量。

2.3 补充:那const变量空间的值到底改变了吗

        结论:是的,const变量的值的确被改变了。而且二者访问的是同一段空间

那在C++执行结果中,为什么直接访问间接访问会出现两种不同的结果呢?

我们可以通过以下代码,看到两段空间的地址:

#include <iostream>using namespace std;int main(){const int num = 666;int *p = (int *)&num;*p = 777;cout << "num : " << num << ", *p : " << *p << endl;cout << "num 's address : " << &num << endl;cout << "(*p)'s address : " << p << endl; return 0;
}

        通过以上执行结果我们可以看到,两次的地址都是同一个值,说明他们两个是同一段空间

二者不同的原因:为了C++程序运行的效率更高,编译器会将常量表中的值缓存中。当我们直接访问num时,访问的其实是栈中的缓存值,而此时被改变的值并没有同步过来。而我们通过指针*p间接访问的是那段内存空间,因此就是被改变之后的值

相关文章:

C++与C语言 通过指针改变const变量的值

一、问题描述 当一个变量声明为const时&#xff0c;通常是不可以改变它的值的&#xff0c;程序设计过程中也不应该这么做。 const int num 666;//我们不应该对num的值进行修改 // num 777; 此语句是错误的 当然&#xff0c;如果我们写以下语句&#xff0c;程序编译也会出现…...

OpenJDK优化技术之标量替换(Scalar Replacement)

标量替换 (SR) 是 OpenJDK 中一项强大的优化技术&#xff0c;旨在通过将复杂对象分解为更简单、更易于管理的标量变量来提高 Java 应用程序的性能。 1.前言 OpenJDK JVM 有两个即时编译器&#xff0c;C1 和 C2。C2 是一种应用许多优化来生成非常高效的编译版本程序的编译器。…...

优思学院|研发工程师获取六西格玛证书有用吗?

在现代的工业领域中&#xff0c;研发工程师不仅需要具备强大的技术能力&#xff0c;还需要掌握有效的管理方法&#xff0c;以确保产品的高质量和高效开发。六西格玛&#xff08;Six Sigma&#xff09;作为一种系统的质量管理方法&#xff0c;已经被广泛应用于各种行业。对于研发…...

C++第二十二弹---vector深度剖析及模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、容量操作 2、内容修改操作 3、打印函数 4、迭代器失效 4.1、什么是迭代器失效 4.2、哪些操作会引起迭代器失效 总结 1、容量操作 size()…...

GD32F470+lwip 丢包问题分析及解决

最近在用GD32和管理机之间用TCP协议开发一个功能&#xff0c;功能都没问题&#xff0c;后面跑大量发包时候的连续测试时&#xff0c;总是会出现偶发性的&#xff0c;大概几分钟到数十分钟的一次丢包。尽管在应用层做了超时机制&#xff0c;一旦超时就会重新建立socket链接并重新…...

好用的电子杂志制作平台分享

随着数字媒体的发展&#xff0c;电子杂志逐渐成为了一种流行的新媒体形式。它不仅能够吸引读者的眼球&#xff0c;还能够帮助创作者展示自己的才华。现在&#xff0c;许多电子杂志制作平台应运而生&#xff0c;让创作者可以轻松地制作出高质量的作品。 今天就给大家推荐一款好用…...

“云原生安全:构建弹性且安全的云上环境的关键要素“

云原生安全是指在设计和实施云原生应用时&#xff0c;从一开始就将安全性融入到每一个环节&#xff0c;确保云环境既具备弹性又安全可靠。构建一个既弹性又安全的云上环境&#xff0c;关键要素包括以下几个方面&#xff1a; 1. 微服务架构&#xff1a;采用微服务架构可以提高系…...

燃气安全阀检验维修:守护家庭安全的必备知识

燃气作为现代生活中不可或缺的重要能源&#xff0c;其安全使用直接关系到人民群众的生命财产安全。 燃气安全阀作为保障燃气系统安全运行的关键部件&#xff0c;一旦发生泄露&#xff0c;必须迅速采取有效措施进行排查、检验、维修&#xff0c;并建立长效机制进行预防和维护。…...

【JavaEE】多线程(1)

&#x1f386;&#x1f386;&#x1f386;个人主页&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;JavaEE专栏&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;计算机是怎么工作的&#x1f386;&#x1f3…...

相对位姿估计

相对位姿估计 示意图 理论推导 离线数据库&#xff1a; P的位置 P [ X , Y , Z ] T P[X,Y,Z]^{T} P[X,Y,Z]T 相机内参 k 1 k_{1} k1​ 安卓手机&#xff1a; 相机内参 k 2 k_{2} k2​ 两个像素点位置 &#xff1a; p 1 和 p 2 p_1和p_2 p1​和p2​ 公式一&#xff1a;…...

记一次 .NET某工业设计软件 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他的软件在客户那边不知道什么原因崩掉了&#xff0c;从windows事件日志看崩溃在 clr 里&#xff0c;让我能否帮忙定位下&#xff0c;dump 也抓到了&#xff0c;既然dump有了&#xff0c;接下来就上 windbg …...

2020 6.s081——Lab5:Lazy page allocation

再来是千年的千年 不变是眷恋的眷恋 飞越宇宙无极限 我们永不说再见 ——超兽武装 完整代码见&#xff1a;SnowLegend-star/6.s081 at lazy (github.com) Eliminate allocation from sbrk() (easy) 顾名思义&#xff0c;就是去掉sbrk()中调用growproc()的部分。1s完事儿。 Laz…...

华为认证学习笔记:生成树

以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至通信中断。为解决交换网络…...

leetcode 97.交错字符串

思路&#xff1a;LCS 其实也是同一个类型的题目&#xff0c;一般涉及到这种子序列的字符串问题的时候&#xff0c;状态的设置基本上都应该是以...结尾为状态的。这里同样&#xff0c;设置用dp[i][j]为s1,s2字符以i&#xff0c;j结尾能否拼接成s3[ij]。 那么&#xff0c;首先就…...

The Missing Semester ( Shell 工具和脚本 和 Vim)

管道符号 &#xff08;1&#xff09;管道符号 | 将前一个命令的输出作为下一个命令的输入 例如&#xff1a; 以下为 ./semester输出中提取包含 "Last-Modified" 的行并写入文件 last-modified.txt./semester | grep "Last-Modified" > ~/last-modif…...

【Uniapp微信小程序】自定义水印相机、微信小程序地点打卡相机

效果图 template 下方的image图片自行寻找替换&#xff01; <template><view><camerav-if"!tempImagePath && cameraHeight ! 0":resolution"high":frame-size"large":device-position"device":flash"f…...

SimPO: Simple Preference Optimization with a Reference-Free Reward

https://github.com/princeton-nlp/SimPO 简单代码 class simpo(paddle.nn.Layer):def __init__(self):super(OrPoLoss, self).__init__()self.loss paddle.nn.CrossEntropyLoss()def forward(self,neg_logit, neg_lab, pos_logit, pos_lab,beta,gamma):neg_logit paddle.n…...

CDH6.3.2安装文档

前置环境&#xff1a; 操作系统&#xff1a; CentOS Linux release 7.7 java JDK &#xff1a; 1.8.0_231 1、准备工作 准备以下安装包&#xff1a; Cloudera Manager: cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm cloudera-manager-daemons-6.3.1-1466458.el…...

Java实战入门:深入解析Java中的 `Arrays.sort()` 方法

文章目录 一、方法定义参数说明返回值 二、使用场景三、实现原理四、示例代码示例一&#xff1a;对整型数组排序示例二&#xff1a;对字符串数组排序示例三&#xff1a;对自定义对象数组排序 五、注意事项六、总结 在Java编程中&#xff0c;Arrays.sort() 方法是一个非常常用的…...

JavaScript的垃圾回收机制

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、垃圾…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...