首先我们先看一个例子:
#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;而结构体的成员常量并未做此展开。
笔试题——通过指针修改const变量,布布扣,bubuko.com
原文:http://blog.csdn.net/taotaotheripper/article/details/23712253