const变量通过指针修改 详解
来源:互联网 发布:软件股票最新上市公司 编辑:程序博客网 时间:2024/06/05 09:37
- 本来以为const变量是无法修改的,今天发现“错了”(其实没错,通过const变量本事是无法修改其值的,但是在“某些情况下”可以通过指向它的指针来间接修改)
一、const变量可以通过指针修改的情况
- 例子:
#include <stdio.h>void main(void){ int const a = 10; int b = 20; int *p = (int*)&a; *p = 20; printf("&a=%x\n", &a); printf("&b=%x\n", &b); printf(" p=%x\n", p); printf(" a=%d\n", a); printf("*p=%d\n", *p);}
解析:
- a和p的地址相同,通过*p其实已经修改了该地址中保存的值,但是为什么a的值仍是10呢?
- 因为a是const变量,编译器对a在预处理的时候就进行了替换。编译器只对const变量的值读取一次。所以打印的是10。a实际存储的值发生了改变。但是为什么能改变呢,从其存储地址可以看出来,其存储在栈中。
二、const变量不可以通过指针修改的情况
- 例子
#include <stdio.h>int const a = 10;//a作为全局变量void main(void){ int *p = (int*)&a; *p = 20; printf("%d\n", *p);}
程序编译通过,但运行时错误
解析:
指示a存储的空间访问冲突,不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且只有可读属性
三、总结:
- 总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
- const局部变量存储在堆栈中,可通过指针修改其值;
- const变量在预处理时处理,编译器只对其值读取一次。
这其实都是因为编译器优化导致的
因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠.
这个”常量折叠“是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。
0 0
- const变量通过指针修改 详解
- const变量通过指针修改 详解
- 通过指针修改const变量
- const变量通过指针修改问题
- 笔试题——通过指针修改const变量
- 程序笔试题-const变量通过指针修改问题
- 程序笔试题-const变量通过指针修改问题
- WM_COPYATA 与 PostMessage/SendMessage;const 的变量通过指针修改后?;指针与数组名
- 【C】 通过指针修改const变量的值【两种思路,关于指针】
- const修饰变量、指针详解
- 【c/c++笔试题一】const变量通过指针修改问题
- 用指针修改const变量问题
- 如何通过二级指针修改变量
- C++中如何修改const变量 (指针)
- const修饰指针 变量
- const和指针变量
- 修改const变量
- 指针修改const
- 光的双缝干涉强度和干涉条纹
- 第三十九级台阶
- Intent action
- 八皇后问题求解-回溯算法
- 误删ubuntu下/usr/bin
- const变量通过指针修改 详解
- python + fabric 实现批量部署
- 嵌入式linux交叉编译环境构建
- Activity常用方法
- uva10534
- 跟着廖雪峰的git教程学习(2)时光机穿梭(一)版本回退
- 模仿百度搜索界面
- 0CTF 2016 RSA?(未完成)
- 【算法------01】从某个数字列表中找出两个彼此最接近但不相等的数