遇到了一个关于const修饰的变量值是否能修改问题,虽然我知道const变量在某些情况下可以通过指向它的指针来间接修改,但是对原理还是很模糊,今天就整理了一下。

一、三个试验压压惊

1、直接对const变量修改

#include <stdio.h>

int main(void)
{
const int a = ;
a = ;
printf("a=%d",a);
}

编译一下,看看出现什么情况:

很遗憾,编译出错了。

2、const变量通过指针修改试验

#include <stdio.h>

 int main(void)
{
const int i = ;
int *p = (int *)&i;
*p = ; printf("&i=0x%x \r\n",&i);
printf("p=0x%x \r\n",p);
printf("i=%d \r\n",i);
printf("*p=%d \r\n",*p);
}
~

编译运行,看看出现什么情况:

编译正常,运行正常

3、const变量真的可以通过指针修改么?

#include <stdio.h>

const int i = 5;
int main(void)
{
int *p = (int *)&i;
*p = 10; printf("&i=0x%x \r\n",&i);
printf("p=0x%x \r\n",p);
printf("i=%d \r\n",i);
printf("*p=%d \r\n",*p);
}

编译运行看现象:

编译通过了,运行时出现了段错误。

二、分析

1、const起作用是在那个时期?编译时期还是运行时期?

这个我们可以通过分析实验1和2来进行定论,实验1是通过显式修改的方式来修改变量值,结果编译器报错。那说明在编译时期,编译器就能发现const被修改这个错误;但是实验2,我们通过指针来间接修改它的值,却发现编译器不仅没报错,反而变量值也被成功修改。说明const常量只是一个编译期间的常量。

2、const修饰全局变量可以修改么?

为了搞清楚这个问题,我进行了实验3,却发现运行时出现了段错误。 我们都知道,出现段错误的原因无非就是这么几个:访问一个不存在的地址、访问系统保护的地址、访问只读内存地址、读写一个空指针、堆栈溢出、数组越界等。我们知道const全局变量存储在全局存储空间,而且是只读的,因此试图修改会出现段错误。

const变量可以修改么?的更多相关文章

  1. const变量的修改实践

    https://bbs.csdn.net/topics/110049293 #include <iostream> using namespace std; int main(){ cou ...

  2. const变量的修改

    int main(){ const char a[]="hello world"; char *aa=(char *)a; printf("\nthe a address ...

  3. C++中如何修改const变量

      一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...

  4. const变量的存储区及修改权限

    转自const变量的存储区及修改权限 [cpp] view plaincopy const int a = 1; int *p = const_cast<int*>(&a); *p ...

  5. const变量通过指针修改问题

    const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...

  6. 修改const变量

    看下面的一段代码 ; int * j=(int*)(&i); // 运行正确,j确为i的地址,但 int *j=&i; 编译错误 *j=; //确实改变了i的值 printf(&quo ...

  7. 为什么为 const 变量重新赋值不是个静态错误

    const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assig ...

  8. [C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配

    转自:http://www.cnblogs.com/sujiantao/archive/2011/12/19/2289357.html MSDN 官方的解释 readonly 关键字是可以在字段上使用 ...

  9. const变量初始化问题

    在C++中const变量定义时必须进行初始化,否则无法通过编译. 初始化的方式有多种,可以通过字面值对其进行初始化,也可以通过变量对其初始化,或其他方式,只要能给const变量赋初值即可(当然初值应该 ...

随机推荐

  1. ABAP语法篇2 内表操作语法

    VALUE MOVE-CORRESPONDING CORRESPOING FOR REDUCE GROUP BY FILTER VALUE语法: 结构赋值 ... VALUE dtype | #(  ...

  2. 如何发布自定义的UI 组件库到 npmjs.com 并且编写 UI组件说明文档

    记录基于 antd 封装业务组件并发布到npm 上的过程:(TS + React + Sass) 初始化项目: 1.yarn create react-app winyhui --typescript ...

  3. HTML中设置在浏览器中固定位置fixed定位

    之前的博文 HTML布局排版之制作个人网站的文章列表,中链接到的文章本身,也需要返回到列表主页,可在每个文章页面加导航条,也可以只加个返回到列表主页的链接.刚开始是想在博文最下方,加个返回文章列表的链 ...

  4. express url跳转(重定向)的实现:res.location() res.redirect()

    Express 是一个基于Node.js 实现的web框架,其响应HTTP请求的response对象中有两个响应url跳转方法res.location() res.redirect(),可以实现301 ...

  5. mysql 中不等于过滤 null 的问题(同时比较等于,大于和小于)

    在写 SQL 条件语句是经常用到 不等于'!='的筛选条件,此时要注意此条件会将字段为 null 的数据也当做满足不等于的条件而将数据筛选掉. 1.原始数据和表结构 CREATE TABLE `tes ...

  6. linux中信号的API详解实例

    /************************************************************************* > File Name: signal.c ...

  7. 重磅!滴滴跨端框架Chameleon 1.0正式发布

    滴滴在 GitHub 上开源的跨端解决方案 Chameleon(简写 CML)正式发布 1.0 版本,中文名卡梅龙:中文意思变色龙,意味着就像变色龙一样能适应不同环境的企业级跨端整体解决方案,具有易用 ...

  8. 【转帖】linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York

    linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York 2015-02-10 10:58:22 youcha ...

  9. (二)linux 学习 -- 探究操作系统

    The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap04.html 文章目录 ls 命令进阶 `l ...

  10. Python31之类和对象1(三大特征:多封继——多疯子)

    一.对象: Python即是面向对象的编程也是面向过程的编程语言,其内部可谓是无处不对象,我们所熟知的列表,字符串等工厂函数本质上都是对象.对象其实是对属性和方法的封装. 属性是对象的静态特征 方法是 ...