同样,有下面一段代码:

 #include <iostream>
using namespace std; int main()
{
const int i = ;
int *j = (int *) &i;
*j = ;
cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x"<<hex<<j<<endl;
cout<<"i value = "<<i<<","<<"j value = "<<*j<<endl;
system("pause");
return ;
}

我们在C++编译器中运行如下:

我们发现const关键字严格遵守了其关于常量的定义。然而疑问出来了

为什么相同的地址会输出不同的值。

同样的代码我们放入C编译器中运行会发现输出结果:

i value = ,j value =

这是为什么呢?

以下是我自己的一点理解:

1.C语言中const为不可改变的变量,其实质仍然是变量,仍然会在编译期间分配内存

那么我们可以获取该内存并修改该内存处的值。这样虽然不允许直接对const 变量修改

但是间接修改该内存位置的值达到修改该变量的效果。

2.C++中const关键字定义的是常量类型,在编译的期间直接确定了其值,比如我们

可进行如下操作在C++中 编译是可以通过的

 const int size=;
int array[size];

表明在编译的时候size是已经确定了。然而这种情况在C语言的情况下是绝对不可以编译通过的,

其实我猜,当我们在c++中定义一个const类型的变量的时候,编译器也是要为其分配内存的,

只不过在编译阶段遇到时候直接替换,在运行的时候,该常量的值是直接存在某个寄存器中,这样

运行代码中需要用到该值时直接可从寄存器中索取,而非在内存中索取。

那么,我们可以作这样一种测试,我们把const前面加上volatile关键字防止编译器直接从寄存器中取

常量值,而是从内存中取,代码如下:

我们发现此时,const类型变量i的值是已经被改变了,则证明我猜想的思路也许是对的,又或许编译器

用了更复杂的方式处理,但是大概思路应该是这样吧

最后我们总结下:

前面说了那么多无非有以下两点:

1.C C++中的const变量是都要分配内存的。

2.C++只不过在编译的时候直接进行变量替换,同时在运行过程中直接在寄存器中取const变量的

   值,这是C++编译器优化的结果。

3.而对于C语言而言每次const使用都是直接从内存中取值,这样每次const变量的间接改变都能得到

   反映。

如果你有更好的理解欢迎一起讨论或者分享。

C与C++中的const的更多相关文章

  1. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  2. C++中的const关键字

    http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...

  3. C++中关于const的思考

    在学习C++的过程中,经常被什么时候使用const.为什么使用const以及怎么使用const关键字这样的问题所困扰,以下是我对const的使用总结. 1.值替代 使用#define的确单缺点,第一: ...

  4. C++中加const与不加const的区别

    “常量”与“只读变量”的区别. 常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它. “只读变量”则是在内存中 ...

  5. C++笔记019:C++中的const修饰的是一个真正的常量

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...

  6. C++中的const总结

    CONST 一.符号常量 声明: const 类型说明符 常量名 = 常量值: const float PI = 3.1415927; //可以交换const与float的位置 符号常量在声明时一定要 ...

  7. C和C++ 中的const

    C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码: #include <iost ...

  8. c++中的const和volatile知识自我总结

    学习了下c++中的const关键字,总结如下. 1.const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”. int main() { c ...

  9. C++中的const的用法

    const对象.指向const对象的指针.const指针(通过一个面试题来了解)   1.const对象 (1)关于const,很多企业的笔试.面试都会出现,很简单,就问你“const的含义?”. 我 ...

随机推荐

  1. memcached学习——大纲简介 && 安装(基于centos6.5)、启动、关闭memcached(一)

    大纲简介 安装前,先简单介绍一下memcached. memcached是一个免费.开源.高性能的分布式缓存.设计memcached的初衷是为了加快web应用程序,减少DB负载. 安装要求:支持大多数 ...

  2. Javascript:简单拖拽效果的实现

    核心代码: /* *完成一个拖拽事件由三大事件组成: *1:onmousedown:选择元素 *2:onmousemove:移动元素 *3:onmouseup:释放元素 */ function dra ...

  3. 视图的touch事件的传播控制

    在视图控制器类中.self.view中会包含多个多层的自己定义视图. 我自己定义了一个uicollectionview类,名称为gridview,又自己定义了一个uicollectionviewcel ...

  4. [置顶] ARM指令集和常用寄存器

    1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令 1,寄存器寻址 MOV R1, R2  //将寄存器R2的值传给寄存器R1 2,立即寻址 MOV R0, #0XFF00 //数据 ...

  5. DFBle.swift

    ////  DFBle.swift//  DFBle////  Created by LeeYaping on 15/9/2.//  Copyright (c) 2015年 lisper. All r ...

  6. ProtoBuf 的java使用

    碰巧用到Proto,算是笔记吧算是笔记吧, windows : 1,两个文件:proto.exe,  protobuf-java-2.4.1.jar 2,建立一个工程TestPb,在下面建立一个pro ...

  7. NS2仿真:使用NS仿真软件模拟简单网络模型

    NS2仿真实验报告1 实验名称:使用NS仿真软件模拟简单网络模型 实验日期:2015年3月2日~2015年3月7日 实验报告日期:2015年3月8日 一.实验环境(网络平台,操作系统,网络拓扑图) 运 ...

  8. thinkphp 中 使用七牛云上传

    利用七牛云私有空间存储文件 第一步,注册七牛云,创建空间,将空间设为私有 需要记下的东西: AK,SK,bucket 第二步配置ThinkPHP 在config.php添加 'UPLOAD_SITEI ...

  9. 2015版Force Touch Mac Book激活三个手指拖动窗口

    新买的2015版的Mac Book Pro,一切都好,就是原来一直很的很习惯的三个手指拖动窗口的手势,突然找不到地方设置了,很是让我失望了一把,在想苹果怎么会把这么有用的手势去掉了呢.还好有万能的Go ...

  10. JSP Servlet SQL 三者之间数据传递

    前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记,web开发重点在于前台数据交互,页面美化而不要太沉溺于底层数据. 浏览器时代来到,向我们召唤出更炫.更简洁.更方便.更大气的网 ...