const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改

大家都知道如下代码中,被const限定的a是不可以被直接修改的

void main()
{
          const int a = 3;
           a=1;
}

  在C++中const修饰的常量,不能被直接修改,但是可以通过指针进行间接修改

来看下面的例子:

   
      

原意是想通过指针修改const常量a的值,但是运行后发现输出的a依然是3,a的值表面上并没有被改变。

但是查看内存窗口,发现a已经被改变,这里是编译器优化导致的,遇见a时编译器直接从寄存器中读取3给a,而不从内存中读取!

为了改善这种状况,我们可以在定义a时再加一个volatile修饰,避免编译器优化:

时间: 2024-10-28 19:21:53

const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改的相关文章

const修饰的常量也是可以被修改的!真的是世界上唯一不变的是变化

这里我用的编译器是Dev c++进行测试的,在研究芯片代码加密的时候偶然发现的const常量也是可以被恶意修改的,所以我在Dev c++里进行了测试,结果发现果不其然.但是这种行为出现在C/C++里我个人觉得是不难理解的,使用C语言风格的强制类型转换本来就是强大而又带有危险的,并且我认为c/c++提供关键字const其实只是提供了语义上的保护,而只要是存在于可读写的内存中,通过恶意的行为总是可以修改所谓的const常量. #include <stdio.h> int main(void) {

const与readonly常量

const与readonly都是用来定义常量,但是它们有什么区别呢? 下面我们来简要的说明一下: const修饰的常量是编译时常量,如:public const String PI=3.1415;什么是编译时常量,通俗来讲就是指你在声明时,必须要进行赋值(也就是初始化),如果不赋值,编译时会出现说“常量字段要求提供一个值”的异常. readonly修饰的是运行时常量,可以在声明中赋值,也可以在构造函数中赋值(注意只能在这两个地方赋值). http://www.cnblogs.com/royenh

Delphi 中 函数参数中的 const 修饰符的本质以及注意事项

来自:http://blog.csdn.net/farrellcn/article/details/9096787 ------------------------------------------------------------------------------ 很多书籍中说函数参数如果是String类型的,如果在函数内部不改变参数的值,使用 const 修饰符会加快程序的执行速度,至于如何加快的?有的人说是因为 const 函数保证了参数字符串不会被复制.以前也没有对这个问题深入研究

const修饰符使用

关键点:const 属于修饰符 ,修饰常量,const 修饰的位置很关键. const修饰指针和修饰变量存在差异 修饰变量 const是常量修饰关键字,被它修饰的**变量**在定义时赋值,之后不能对这个变量赋值,如果强制进行赋值会产生出错处理, int const a;与const int a; //无差别 const int a[5]={1,2,3,4,5}; a[0]=3;/*出错,对数组a[]中任意一个再次赋值都会出错*/ int a[5] //除了定义时赋值,再次对数组a[]中任何一个元

C++ const修饰类成员的说明

#include <iostream>#include <string.h>#include <stdio.h>#include <stdlib.h>using namespace std;/* A1 const 修饰一个类中成员变量,则此变量必要用初始化列表来进行初始化. A2 const 修饰一个类中成员函数,则表示此成员函数不会修改类中所有成员变量. A3 const 修饰一个函数入参的引用时,表示此引用的内容不得在此函数中发生变化. A3.1 con

c语言const修饰的变量可以通过指针修改其值

在没有优化的编译器中是可以修改的.在xcode6.1中在同一个函数中是不可以修改的但通过一个函数调用可以修改如. debian 8.1中是可以直接修改的.以上只是我个人学习中的理解. int changeValue(const int value) { int *p = NULL; p = &value; *p = 20; return value; } int main(void) { int  changeValue(10); printf("value = %d\n",

const修饰符简述

1.const限定符的使用 1)定义const常量:const可以将一个对象变成常量,不可被修改(只读类型),在定义时必须进行初始化.例如: const double mathPI = 3.141592653; 2)修饰函数的参数.返回值等.被const修饰的东西将不再改变: 3)若在整个程序中使用其他文件的变量: //若变量为非const //file_1.cpp int months = 10; //file_2.cpp extern int months; //const修饰的变量 //f

C++的const修饰

C++的const修饰 ?const的两个用途? (1)可以定义 const 常量  (2)const 可以修饰函数的参数.返回值. const的好处 (1)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患! (2)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性! (3)可以节省空间,避免不必要的内存分配(常量宏)! (4)提高了效率. 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为     一个编译期间的常量,没有了存储与读内存的操作

static extern const修饰符

const const修饰的东西不能被修改(由左至右解读-->顺时针螺旋法则) 指针类型根据位置的不同可以理解成3种情况: 1.常量指针 NSString * const pt1; //常量指针,指向一个字符串 //pt1初始化之后不能赋值,指向的对象值可以修改. //定义字符串常量 //NSString* const [email protected]"123"; @"123"存储在文字常量区,相同的字符串只存储一份 NSString* [email pro