遇到了一个关于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. 小程序 支持html富文本吗

    详见: https://www.jianshu.com/p/9b9b97b17393

  2. 最新 中细软java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.中细软等10家互联网公司的校招Offer,因为某些自身原因最终选择了 中细软.6.7月主要是做系统复习.项目复盘.LeetC ...

  3. ucore 源码剖析

    lab1 源码剖析 从实模式到保护模式 初始化ds,es和ss等段寄存器为0 使能A20门,其中seta20.1写数据到0x64端口,表示要写数据给8042芯片的Output Port;seta20. ...

  4. LeetCode 198. 打家劫舍(House Robber) 5

    198. 打家劫舍 198. House Robber 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两 ...

  5. LeetCode 189. 旋转数组(Rotate Array)

    189. 旋转数组 LeetCode189. Rotate Array 题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6, ...

  6. 使用TypeScript创建React Native

    ⒈初始化 React Native环境 参考https://reactnative.cn/docs/getting-started.html ⒉安装React Native官方的脚手架工具 npm i ...

  7. Android中使用LitePal操控SQLite数据库

    <第一行代码>读书手札 (一)什么是LitePal数据库 LitePal数据库是安卓的一个开源库,我们在以后的开发中,将会遇到许许多多的开源库,感谢开源社 区:因为开源社区的存在,一些我们 ...

  8. Markdown 语法 (转载)

    Markdown 语法整理大集合2017   1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 ####### h7 // ...

  9. 利用Python进行数据分析 第5章 pandas入门(1)

    pandas库,含有使数据清洗和分析工作变得更快更简单的数据结构和操作工具.pandas是基于NumPy数组构建. pandas常结合数值计算工具NumPy和SciPy.分析库statsmodels和 ...

  10. 初始NLTK

    NLTK官网:链接 Natural Language Toolkit NLTK corpora and lexical resources such as WordNet, along with a ...