求教啊关于const,该怎么处理

求教啊,关于const
#include <iostream>
using namespace std;

int main()
{
const int a = 1;
int b = 2;
int *p = &b;
*(p + 3) = 3;

cout<<(unsigned)&a - (unsigned)&b<<endl;
cout<<a<<" "<<&a<<"  "<<p + 3<< "  " << *(p + 3)<<endl;


return 0;
}

以上代码用VS2012编译结果为:
12
1 0103FCC8  0103FCC8  3
请按任意键继续. . .

为什么是12,为什么a没变3...

#include <iostream>
using namespace std;

int main()
{
const int a = 1;
int b = 2;
int *p = &b;
    *(p - 1) = 3;
   
    cout<<(unsigned)&b - (unsigned)&a <<endl;
cout<<a<<" "<<&a<<"  "<<p - 1<< "  " << *(p - 1)<<endl;
return 0; 
}



用c-free 编译结果是这样的

4
1 0x23ff38  0x23ff38  3
请按任意键继续. . .

a还是没变3啊。。

求解

------解决方案--------------------
 
a被常量表达式初始化就成了一个编译期常量.
如果你对a没有取地址操作,编译器会做优化,不会为a划分内存,划分内存也仅仅是为了满足&a.
里面的值会被初始化为i的值.但是在程序上,名字i表示的是原先的值,而不是内存里的值.
(盗用了一位前辈的话)
也就是所谓的常量重叠了!
------解决方案--------------------
是当做立即数了,编译器直接把取a值的部分用常量替换了。
引用:
Quote: 引用:

 
a被常量表达式初始化就成了一个编译期常量.
如果你对a没有取地址操作,编译器会做优化,不会为a划分内存,划分内存也仅仅是为了满足&a.
里面的值会被初始化为i的值.但是在程序上,名字i表示的是原先的值,而不是内存里的值.
(盗用了一位前辈的话)
也就是所谓的常量重叠了!


是编译器把他当作立即数了吗