首先我们先看一个例子:
#include <iostream>
#include <assert.h>
using namespace std;
struct S{
const int c; //常量普通成员变量
static const int sc; //常量静态成员变量
S():c(0){
}
};
const int S::sc = 0;
const int gc = 0; //常量全局变量
static const int gsc = 0; //常量静态全局变量
int main()
{
const int lc = 0; //常量局部变量
static const int lsc = 0; //常量静态局部变量
const S ls; //局部常量结构体
int *p;
p = (int *)(&ls.c);
//p = (int *)(&ls.sc);
//p = (int *)(&gc);
//p = (int *)(&gsc);
//p = (int *)(&lc);
//p = (int *)(&lsc);
*p += 10;
cout << *p << "\t" << ls.c << endl; // 10 10 - (1)
//cout << *p << "\t" << ls.sc << endl; // 段错误 - (2)
//cout << *p << "\t" << gc << endl; // 段错误 - (3)
//cout << *p << "\t" << gsc << endl; // 段错误 - (4)
//cout << *p << "\t" << lc << endl; // 10 0 - (5)
//cout << *p << "\t" << lsc << endl; // 段错误 - (6)
return 0;
}
通过上例,我们可以总结出如下结论:
1. 全局const变量和static const变量由于被存放在只读的常量区,所在内存被访问时会出现段错误;
2. 局部const变量存放在可读写的栈中,可以通过指针修改其值;
3. 简单常量在编译时被作为常量展开,所以(5)中的cout << lc << endl事实上运行的是 cout << 0 << endl;而结构体的成员常量并未做此展开。