如何修改const常量的值

关于常量传播(如何修改const常量 关于常量折叠 今天在回顾C++const_cast的时候无意写了这样一段代码: #include using namespace std; int main(){ const int i=100; int *p=const_cast(&i); (*p)++; cout<<p<<" "<<&i<<endl; cout<<*p<<" "<<i<<endl; } 运行结果如下: 0x22f 阅读详情

    看到这个标题,你也许会说,我不懂const, 因为Const修饰的是不可变得变量,他的值是不能修改的。没错,const修改的值的确不能修改,但是也有条件,条件就是编译不能通过,const是一个编译时期常量。如果我能在绕过编译器,通过编译后,我仍然可以修改const的值。

    分C/C++两种情况讨论:

    一 C语言:

    const long lng=10;
     long *pl=(long)&lng;
     *pl=1000;
     cout<<*pl<<endl;//输出1000
     cout<<lng<<endl;//输出10

    这是什么原因呢?因为const的值是放在一个符号表中存储的,只读的。编译器会在内存中重新在内存中创建它的一个拷贝,通过地址访问到的是这个拷贝,而不是原始值。

    二 C++语言:


class Integer
{
   public:
     Integer():m_lng(100){}
     long m_lng;
}

const Integer int_l;
Integer *pInt=(Integer*)&int_l;
pInt->m_lng=1000;
cout<<pInt->m_lng<<endl;//1000
cout<<int_l.m_lng<<endl;//1000修改成功

    由此可以看出,const只是编译时期的一种强类型安全检查机制的一种手段,他只是帮组我们发现无意中修改的常量,无法在二进制层面进行保护。

Allan方差读图分析IMU误差指标 Allan方差标定IMU参数实测分析 阅读详情

相关推荐

【嵌入式DIY实例-ESP32篇】-智能花园助手

本文介绍了一个基于ESP32的智能花园监控系统。系统使用ESP-EYE摄像头开发板,集成了土壤湿度传感器、DHT22温湿度传感器和电磁阀等模块,实现植物生长环境监测与自动灌溉功能。硬件部分详细说明了各传感器的接线方式,软件部分展示了如何通过Firebase实现数据存储和远程监控。系统可实时采集土壤湿度、空气温湿度等数据,并通过摄像头监控植物状态,当检测到环境参数异常时,可自动控制水泵进行灌溉,为植物提供最佳生长环境。

视觉与物联智能 234

C语言const修饰的常变量可以修改

const关键字是C语言中很重要的一个关键字,被它”修饰“的变量我们称为常变量。那这个常变量的到底能不能修改呢?我们先来看一下变量名与变量之间的关系:变量:用来标识(identify)一块内存区域,这块区域的一般是可以更改的,这就是它“变”的由来。变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用变量使我们操作内存以区域(area),以块(block)为单位,提高...

勇往直前的博客 1万+

汽车理论课后习题Matlab程序.docx

汽车理论课后习题Matlab程序

const 修改常量问题

const 是用来定义常量的,但是,经过定义后的常量是不能被修改的,一旦修改会报 Assignment to constant variable. 错误,比如: // let 修改定义后的变量 let num = 100 console.log(num) // 100 num = 200 console.log(num) // 200 // const 修改定义后的常量 const a = 100 console.log(a) // 100 a = 200 // 报错

weixin_45982960的博客 895

浅谈对const常量”的修改

在印象中,用#define和const修饰的变量都是常量,即不能改变的量。 其实非也,#define的变量才是真常量,不可改变,在程序预处理阶段,编译器会将所有引用#define变量进行原样替换。const是由编译器判断实现的假常量。称const修饰的变量为常量其实是一种错误的说法,准确地说为只读变量。 那么const修饰的变量真的是只读,而不能修改吗?同样非也。 可能有些同学想到了可以用...

ganwenbo2011的博客 1057

单片机编程中的const和code

今天xi 在单片机使用C语言进行编程的时候,经常使用到code。code是keil C51(也就是说,在其它的编译器中可能是其它形式,例如IAR中的CODE)里面的关键字,一般用于定义常量数组,意思是告诉编译说把这个数组放在ROM存储。使用ROM(程序存储器)的好处是加快读取速度,不占用系统资源。 unsigned char code table[]; 表示分配一个指向code区的指针,指针本

一亩三分地 9653

const定义的变量,是否可以修改

const定义的变量,是否可以修改

遇事不决,可问春风。 2010

能否通过内嵌汇编修改C++const常量

最近学了一点点汇编,突然想到能不能通过内嵌汇编修改C++const常量。 可以看到定义const常量也是在堆栈中开辟空间 也可以改变所在地址的 然而当我们输出i时,直接把1入栈,相当于在以后编译器把i当作1处理了   一篇文章c++const常量存储位置探讨 结尾写到: 1.对const常量取地址时,编译器会进行内存分配,并将常量转换为立即数存入内存,而不

ProgrammingLearner的博客 1176

C++中能否通过内嵌汇编修改const常量

最近学了一点点汇编,突然想到能不能通过内嵌汇编修改C++const常量。G++编译器下 由于汇编只懂皮毛,不知道如何知道i的地址,于是用蠢办法输出它的地址 - -! 发现并没有改变,于是网上搜到了一篇文章,附上链接c++const常量存储位置探讨反汇编代码看不懂- - 它的结尾写到: 1.对const常量取地址时,编译器会进行内存分配,并将常量转换为立即数存

ProrammingLearner的博客 426

指针重点总结-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的修改等问题

C/C++指针踩坑历险记-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的修改等问题 好久没写C语言了,不过一直用C++在刷题,遇到指针总有些发憷?初学指针的时候觉得指针好难,其实搞清指针的重要几个概念,指针就不难~对指针一些重点知识进行一个总结。 指针初体验 我们知道指针本质上就是一个存放地址的变量(该变量存放地址,一串你看不懂的数字)。比如 int a = 3; int* ptr = &a;//就表示指向a的一个变量ptr,ptr内部存放的

qq_44850917的博客 2275

C++57个入门知识点_02_const常量限制(解决C中define无法指明数据类型问题、常量一旦定义生命周期内不可修改编译器在程序编译时期做的检查、编译时不确定的,才可以通过指针修改运行时的

本篇主要来介绍C++中新的关键字,关键字是一样的,但是其意义已经不一样了,const常量就是这样的。 在C中计算圆的面积,其中PI的固定,常用的方法如下: #include <iostream> //C命令中写法 //宏的编译本质上是文本级的替换,在编译之前用pi对3.14替换,但未指定数据类型 #define PI 3.14 //main函数其实有参数的 //int nArgc为命令函参数个数,char* pArgv[]为命令行参数指针 int main(int nArgc, char*

分享学习成长历程,Winter is coming! 530

c++ const的使用(引用,指针)

1)const 对象,一旦创建后,就不能在改变,所以要对const对象进行初始化 const int i=get_size();初始可以是任意复杂的表达式 const int j=42;对 const int k;错 2)例:const int bufSize=512; 编译器会在编译过程中,把所有用该变量的地方都替换成对应的,即出现bufSize的地方都换成512 3)extern con...

weixin_38527536的博客 289

关于vue3中const常量为何能改

学过javascript应该都知道const定义的为常量不能修改,但只限于普通数据类型,也就是说引用数据类型(数据,对象等)是可以修改的,那么vue3中定义的ref元素就是一个对象类型,修改的时候你应该会用到,常量名.value吧,那么这就是一个对象。

Q1280735465的博客 503

C++学习笔记---const关键字

文章目录1.const2.const的引用3.const和指针 1.const const修饰的变量将不能被改变,例如: const int a=5; a=10;//错误,a被const修饰,其不能改变的 默认情况下,const对象尽在文件内有效 2.const的引用 可以对常量添加引用,但是添加引用不能改变常量。 例子: const int c=1024; const int &r =c;//正确,常量的引用和他的对象均为常量 r=10;// 错误,r是对常量的引用,不能改变它的 i

qq_44664843的博客 220

C++】C 语言C++ 语言const 关键字分析 ( const 关键字左数右指原则 | C 语言常量的原理和缺陷 | C++ 语言常量原理 - 符号表存储常量 )

一、C 语言 const 关键字简介 - 左数右指原则 1、const 关键字左数右指原则 2、代码示例 - const 关键字左数右指原则 3、const 关键字使用场景 二、C 语言 const 关键字原理分析 1、C 语言常量的原理和缺陷 2、代码示例 - C 语言中直接改变常量报错 3、代码示例 - C 语言中使用常量地址修改常量 三、C++ 语言 const 关键字 - 符号表存储常量 1、C++ 语言常量原理 2、代码示例 - 分析指针指向的和实际常量

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1723

C/C++const常量真的可以用指针修改

C/C++const常量真的可以用指针修改常量在程序运行前就已经存在,并在程序运行时加载到常量区。 若定义常量a并赋,之后使用指针p修改a的。此时即使对a做任何计算,a的还是未修改,但是*p的会是修改后的。 看这段代码,首先定义一个常量a等于5。再使用p指针指向a,并修改。那么最后输出a结果如何呢? int main() { const int a = 5; // 定义常量a = 5 int *p = (int*)&a; // 指针指向a,

韩小非的博客 1535

const 与 指针

引用链接: https://www.cnblogs.com/lihuidashen/p/4378884.html int * const p_snack; // 指向整形的常量指针,它不能在指向别的变量,但是指向(变量)的可以修改const int * p_snack; // 指向整形常量的指针,可以指向其他变量,但是它指向的指不能修改。 ...

Numen的博客 175

go基础--常量

1、语言常量 常量:程序运行时,不会被修改的量 const identifier [type] = value; 显式 类型定义 const b string = "abc" 隐式: const b = "abc" iota: 特殊常量,被认为可被编译器修改的量。 在const关键字出现时被重置为0,const中每新增一行便将iota计数一次(iota可以被认为const语句块中的行索引),iota可以被认为是枚举const ( a = iota//=0 b = iota//1 c

qq_31805127的博客 127

C 语言常量和变量的区别

3. 作用域不同:常量可以在定义它的文件中的任何地方使用,而变量通常具有局部作用域,只能在定义它的函数内部使用。常量和变量在 C 语言中是两种不同的标识符,它们在定义方式、是否可以改变、作用域和初始化方式等方面存在差异。4. 初始化方式不同:常量在定义时必须初始化,而变量可以在定义时初始化,也可以在后续程序中进行赋。2. 是否可以改变:常量在程序运行期间是不能改变的,而变量的可以在程序运行期间进行修改。1. 定义方式不同:常量在定义时必须使用const关键字,而变量可以直接定义。

lxl12138的博客 2507

宏定义常量const定义常量的区别

心得: 这两种方式在语法上都是合法的,但是第二种方式要比第一种方式好,因为如果使用#define定义宏,PI会在代码的预编译阶段被预编译处理器替换成3.14159,宏的名称不会出现在符号表中,这样会给代码后期的调试带来麻烦,可能会遇到一个数字,却不知道它从何而来,这就是我们常说的Magic Number(像拥有魔力一样不知从何而来的数)。使用const定义,既可以保证PI的唯一性,又便于调

fengzizhuang的专栏 5771

c++基础 const 修改

int main() { const double minvalue = 9.6; ///定义常量double const double *ptr = &minvalue; ///将minvlaue地址赋予ptr cout<< *ptr<<endl; ///结果: 9.6 double dal = 10.6 ; ///定义dal = 10.6

GZ专栏 524
上一篇: .net多线程总结
下一篇: 如何在类中建立恒定的常量
burningcpu
博客等级 码龄20年 13粉丝 83原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值