const常量深层次学习!!

最近在看一些有关const的知识点时,发现一个有趣的事情,据说通过这段代码就可以修改常量的值:
const int a = 10;
int *p  = (int*)&a;
*p = 20;
cout << *p << endl;
我在visual c++中调试了一下,a的值没有变,在百度中看到一个大神的回答很是犀利,收藏让大家看看!
void main()
{
 const int a=3;
 int *p;
 p=(int *)&a;
 *p=5;
 printf("%d",a);
 printf("%d",*p);
}
 
 
这个const a的值和它的地址没有丝毫关系,当出现a时,就会用3替换(就像宏一样),当以它的地址访问时(前提是编译器不会把它优化成a,比如*(&a)会优化成a),就会是地址单元的值
 
const int a=3;
011713CE mov dword ptr [a],3 
int *p;
p=(int *)&a;
011713D5 lea eax,[a] 
011713D8 mov dword ptr [p],eax 
*p=5;
011713DB mov eax,dword ptr [p] 
011713DE mov dword ptr [eax],5 
printf("%d",a);
011713E4 mov esi,esp 
011713E6 push 3 //看这里,直接取3,和a的地址没有丝毫关系 
011713E8 push offset string "%d\n" (1175830h) 
011713ED call dword ptr [__imp__printf (11782D4h)] 
011713F3 add esp,8 
011713F6 cmp esi,esp 
011713F8 call @ILT+300(__RTC_CheckEsp) (1171131h) 
printf("%d",*p);
011713FD mov esi,esp 
011713FF mov eax,dword ptr [p] 
01171402 mov ecx,dword ptr [eax] 
01171404 push ecx 
01171405 push offset string "%d\n" (1175830h) 
0117140A call dword ptr [__imp__printf (11782D4h)] 
01171410 add esp,8 
01171413 cmp esi,esp 
01171415 call @ILT+300(__RTC_CheckEsp) (1171131h) 
 
你可以试试 printf("%d",*(((&a)+1)-1)); 和 printf("%d",*(&a));
 
也可以试试这样
int t=3;
const int a=t;
p=(int *)&a;
 *p=5;
 printf("%d",a);
 printf("%d",*p);
 
 
 
其中包含汇编语言,不会的赶紧去补充知识哦!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值