1.
char* p = "abcde";
const char s[10] = “abcde”;
const int x[2] = {1, 2};
const int i = 10;
四者分别放在哪里
// 比如是不是 p指向的"abcde"在文字常量区(.text????) s[10]被放在.rodata中? 那x[2]和i被放在哪里呢
2.
和上一个问题相关
为什么s[2]可以通过const_cast修改值 //x[1] x[0]也可以
用const_cast修改p[2]值程序会崩溃
好像i被载入了编译器的符号表,所以修改i对应的内存,输出i还是不变的?
为什么x[0] x[1] 不被载入符号表呢?
也就是为什么用const_cast修改他们会有不同的表现呢,起码有三种吧,麻烦分别解释下
参考,编译器的符号表:https://blog.csdn.net/heyabo/article/details/8745942
话说运行时为什么还有编译器的事?
x[0.1.2]值可以改变,只是防止重复定义
1、const 加在 操作类型符前面:值的内容不可变; const char* const p = "abcde" ; 指针和指针所指的内容不可
2、const 修饰的常量放在 .rodata
3、const_cast 修改的左值也只能是一般变量,不能是 const 变量, const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。
4、编译分为 预编译和运行时编译,预编译主要是做 文件包含,宏加载等工作; 运行时编译就是代码运行过程中变量动态加载、多肽等操作
个人愚见,欢迎指正
const可以修饰普通变量,该变量就会被当做常量来处理,即其值一经初始化就再不能被修改。
常量指针:指向常量的指针。即无法通过该指针修改其目标。
const int *cp int const *cp *cp = 200 //编译错误 cp = &b //可以编译
指针常量:指针型的常量,即无法修改其值的指针。
int * const pc = &b //指针常量 int c = 300; pc = &c //编译错误
const int * const p //常量指针常量,p本身不能改,其目标也不能改。 int 前面的const 是指*p是不可以更改的