当前位置: 首页 > 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】 文章目录 一、垃圾…...

React-Grid-Layout外部拖拽:从零构建可视化编辑体验

React-Grid-Layout外部拖拽&#xff1a;从零构建可视化编辑体验 【免费下载链接】react-grid-layout A draggable and resizable grid layout with responsive breakpoints, for React. 项目地址: https://gitcode.com/gh_mirrors/re/react-grid-layout 在构建现代Web应…...

3大技术突破重构macOS鼠标体验:Mac Mouse Fix深度解析

3大技术突破重构macOS鼠标体验&#xff1a;Mac Mouse Fix深度解析 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 核心痛点分析&#xff1a;mac…...

3大突破:让网课学习效率提升300%的智能方案

3大突破&#xff1a;让网课学习效率提升300%的智能方案 【免费下载链接】auto-play-course 简单好用的刷课脚本[支持平台:职教云,智慧职教,资源库] 项目地址: https://gitcode.com/gh_mirrors/hc/auto-play-course 在数字化学习普及的今天&#xff0c;职业教育学生平均每…...

Qwen2.5-VL应用指南:如何用它做智能客服、文档分析和内容创作

Qwen2.5-VL应用指南&#xff1a;如何用它做智能客服、文档分析和内容创作 1. 引言&#xff1a;认识Qwen2.5-VL的强大能力 Qwen2.5-VL是通义千问团队推出的最新视觉-语言多模态模型&#xff0c;相比前代产品有了显著提升。这个7B参数的模型不仅能理解图像内容&#xff0c;还能…...

如何搭建与使用 `ZhongFuCheng3y/austin` 开源项目

如何搭建与使用 ZhongFuCheng3y/austin 开源项目 【免费下载链接】austin 消息推送平台&#x1f525; 推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。 项目地址: https://gitcode.com/GitHub_Trending/au/austin 本教程旨在帮助…...

除了阿里云,还有哪些靠谱的身份证实名认证方案?SpringBoot整合横向评测

SpringBoot整合主流身份证实名认证API横向评测&#xff1a;从阿里云到多服务商技术选型指南 当你的应用需要接入身份证实名认证功能时&#xff0c;阿里云可能只是众多选项中的一个起点。作为技术决策者&#xff0c;如何在腾讯云、百度智能云、聚合数据等众多服务商中做出最优选…...

Marp CLI元数据管理:如何优化SEO和社交媒体分享

Marp CLI元数据管理&#xff1a;如何优化SEO和社交媒体分享 【免费下载链接】marp-cli A CLI interface for Marp and Marpit based converters 项目地址: https://gitcode.com/gh_mirrors/ma/marp-cli Marp CLI是一款强大的命令行工具&#xff0c;让你仅用纯Markdown就…...

2026年,山东专业联想服务器解决方案,涵盖SR858 V3等众多型号!

在当今数字化飞速发展的时代&#xff0c;服务器作为企业数据处理和存储的核心设备&#xff0c;其性能和可靠性至关重要。联想服务器凭借其卓越的性能、丰富的功能和广泛的应用场景&#xff0c;成为众多企业的首选。今天&#xff0c;我们就来详细了解一下联想SR858 V3服务器。联…...

小白程序员必看:大模型“语义崩塌”陷阱与收藏攻略!

本文深入解析了“语义崩塌”现象&#xff0c;即在大模型处理海量数据时&#xff0c;向量语义失去区分度导致搜索失效。以斯坦福RAG研究为例&#xff0c;揭示高维空间下“维度灾难”如何导致相关性计算失效&#xff0c;影响企业级应用。文章提出分层检索和基于图谱的检索作为解决…...

comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场...

comsol的单相变压器绕组及铁芯振动形变仿真模型 1、单相变压器组振动形变模型:绕组在漏磁场的洛伦兹力作用下振动&#xff0c;在长期作用下发生位移形变 2、单相变压器铁芯振动形变模型:铁芯在磁致伸缩作用下发生振动形变 注:时域仿真可以设置观察点&#xff0c;导出随时间变化…...