c中可以修改const修饰的变量的值
//局部变量
int main(){
const int c = 10;//只读
int *p = (int*)&c;
printf("c===>%d\n", c);//输出为10
*p = 11;//a的值可以被修改
printf("c===>%d\n", c);//输出为11
printf("p===>%d\n", *p);//输出为11
}
//全局变量
const int c = 10;//只读
int main(){
int *p = (int*)&c;
printf("c===>%d\n", c);//输出为10
*p = 11;//a的值可以被修改
printf("c===>%d\n", c);//输出为11
printf("p===>%d\n", *p);//输出为11
}
c++中不可以修改const修饰的变量的值
//局部变量
int main(){
const int c = 10;
int *p = (int*)&c;
printf("c===>%d\n", c);//输出为10
*p = 11;//a的值不可以被修改
printf("c===>%d\n", c);//输出为10
printf("p===>%d\n", *p);//输出为11
}
为什么*p输出的是11?
原因: 局部变量 const int c其实是保存在符号表中,无内存地址,但自己对c进行&c,那么编译器会为c分配一个地址,
但取c的值依然是从符号表中取值,而用指针int *p=&c;*p=11;这个值是改变c的内存所表示值,不会改变符号表中c的值
//全局变量
const int c = 10;
int main(){
int *p = (int*)&c;
printf("c===>%d\n", c);//输出为10
*p = 11;//段错误 Segmentation fault
printf("c===>%d\n", c);//
}
为什么会段错误?
c++中全局const变量是不分配内存地址的,它编译器放置在符号表中作为编译期常量,全局const变量放在只读数据段中,
受到只读数据段的权限保护,当你修改一个只读数据段中的内容时,会得到一个运行时错误。
C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用,会分配存储空间
当使用&操作符,取const常量的地址时,会分配存储空间
当const int &a = 10; const修饰引用时,也会分配存储空间
int main(void)
{
//const 定义常量-‐-‐-‐> const 意味只读
const int a;
int const b;
//第一个第二个意思一样 代表一个常整形数
const int *c;
//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
int * const d;
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
const int * const e ;
//第五个 e⼀一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
return 0;
}
https://mp.csdn.net/postedit/81749964
借鉴:https://blog.csdn.net/h1418792278/article/details/78009957