const变量通过指针修改 详解

  • 本来以为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);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果:

解析:
  • 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);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里写图片描述

程序编译通过,但运行时错误

解析:

指示a存储的空间访问冲突,不可以写,也就是没有写权限,不能修改其值。估计是存储在全局空间,且有只读属性

三、总结:

  1. 总结,const全局变量存储在全局存储空间,其值只有可读属性,不能修改;
  2. const局部变量存储在堆栈中,可通过指针修改其值;
  3. const变量在预处理时处理,编译器只对其值读取一次。
  • 这其实都是因为编译器优化导致的

    因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠.

    这个”常量折叠“是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。

    因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!! 
    简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值