const全局/局部变量C在C语言中const修改全局变量是存储在全局区(即静态存储区),修饰局部变量时存储在栈区
//const修饰的常量const int a = 10;//全局const常量,放在常量区,受到常量区的保护void test01(){ //直接修改失败 a = 100; //间接修改失败 int *p = &a; *p = 100;}
- 全局的const修饰的变量本质就是常量,全局const修饰的变量放在常量区中,不能通过变量名直接修改也不可以通过地址来间接修改
- 局部const修饰的变量是个伪常量,不是真正意义上的常量,数据存放在栈区而不是常量区,可以间接修改但是不能直接修改 。
- C语言的const修饰的全局变量和局部变量都有空间
- C语言的const修饰的全局变量具有外部链接属性 , 可以采用extern声明在别的文件中使用
举个例子:
const int aa = 10;//没有内存void test01(){ cout << aa << endl;//在编译阶段,编译器会自动优化,将aa直接替换成常量10 const int bb = 20;//栈区 int *p = (int *)&bb; *p = 200; cout << bb << endl;//输出的还是20,还是那句话,在编译阶段代码中的bb就已经全部被替换成20,此时其实输出的是这样的cout << 20 << endl;但是变量bb此时的值已经被改变了,变成了200,但是由于编译器优化,造成了常量折叠现象}总结:
- C++语言的const修饰的变量有时有空间,有时没有空间(发生常量折叠,且没有对变量进行取地址操作)
- C++中,const修饰的全局变量具有内部链接属性,也就是说,无法使用别的文件的const修饰的变量,但是这种规则依旧可以打破
- const修饰的全局变量永远都没有内存 , 永远无法修改它的值 , 但是const修饰的局部变量可以有空间,可以修改它的值
- 不能优化自定义数据类型
- 如果用变量给const修饰的局部变量赋值,那么编译器也不能优化
- 使用extern和voaltile关键字来阻止优化
void test03(){ int a =10; const int b = a; int *p = (int *)&b; *p = 100; cout << b << endl;//输出100}例子二:利用关键字阻止优化
void test04(){ const volatile int a = 7; int *p = (int *)(&a); *p = 8; cout << "a=" << a << endl;//输出8 cout << "*p=" << *p; system("pause"); return 0;}例子三:自定义数据类型不能优化
struct Maker{ Maker() {a = 100; } int a;};void test05(){ const Maker ma; cout << ma.a <<endl; Maker *p = (Maker*)&ma; p->a = 200;//可以修改ma中的值 cout << ma.a << endl;}const修饰指针和引用const修饰指针涉及到两个很重要的概念 , 顶层const和底层const
从 const 指针开始说起 。
const int* pInt;
和 int *const pInt = &someInt;
, 前者是 *pInt
不能改变,而后者是 pInt
不能改变 。因此指针本身是不是常量和指针所指向的对象是不是常量就是两个互相独立的问题 。用顶层表示指针本身是个常量,底层表示指针所指向的对象是个常量 。更一般的,顶层 const 可以表示任意的对象是常量,这一点对任何数据类型都适用;底层 const 则与指针和引用等复合类型有关,比较特殊的是,指针类型既可以是顶层 const 也可以是底层 const 或者二者兼备 。int a = 1;int b = 2;const int* p1 = &a;//指针常量(顶层const)int* const p2 = &a;//常量指针(底层const)1.指针常量(指针不可改 , 指针指向的对象可改)int a = 10;int b = 5;int * const p1 = &a;p1 = &b; //指针不可改,不合法*p1 = b; //指针指向的对象可改,合法2.常量指针(指针可改,指针指向的对象不可改)int a = 10;int b = 5;const int* p2 = &a;p2 = &b; //指针可改, 合法*p2 = b; //不合法
推荐阅读
- 手机怎么把QQ空间说说一次性全删掉(qq如何恢复删掉的说说)
- 怎么一次性删掉QQ空间里的全部说说(翻看以前qq空间的说说)
- 怎么把空间说说全部清空(qq空间一键清空所有说说)
- 手机QQ空间怎么一次性删除说说求解(怎么一键删除qq说说)
- qq空间说说怎么全部删除(怎样一键清空qq空间)
- 如何注销空间 1980717Z空间
- qq空间说说怎么全部删除(qq空间说说一键恢复)
- QQ空间说说太多怎么一次性全删除(说说可以一键删除吗)
- 手机QQ空间怎么一次性删除说说求解(一键删除qq说说)
- 用电脑扣扣空间说说怎么批量删除(怎么批量删除自己qq空间说说)