C++ const原理
来源:互联网 发布:应用备份软件 编辑:程序博客网 时间:2024/06/05 11:46
抛出问题
下列代码输出的结果是什么?
#include<stdio.h>#include<iostream>using namespace std;int main(){/*在c++下*/ const int a = 10; //a = 100;error int *p = (int*)(&a); *p = 100;//正确 cout << *p << endl; cout << a << endl; system("pause");}
resault:
100
10
讲解学习
原理
在C++中,被const修饰的变量,可能为其分配存储空间,也可能不分配存储空间。
有下面两种情况,会为这个变量分配存储空间:
1、当const常量为全局,并且需要在其它文件中使用时,(extern)
2、当使用取地址符(&)取const常量的地址时。
如果没有为这个变量分配空间的情况下,这个变量是不可能被改变的,也就是说,这个变量是实实在在的常量。这种情况下,没有任何争议。
解疑
下面咱们讨论文章的一开始举得例子。
const int a = 10;
变量a=10,a放在了符号表里面,这个值永远不会变。当取a的值的时候,就从符号表里面取,永远是10.
int *p = (int*)(&a);
定义一个新的指针变量p,指向变量a的地址。这时,会在栈上为变量a分配一个新的空间,存放变量a的值。然后用指针p指向这个空间。例如这个内存空间的地址是0x00FF00CC。
*p = 100;
把内存地址0x00FF00CC空间的值修改为100。
cout << *p << endl;//从内存0x00FF00CC中取值,等于100.cout << a << endl;//从符号表中取值,等于10.
c语言中的const
int main(){/*在c下*/ const int a = 10; //a = 100;//error int *p = (int*)(&a); *p = 100;//正确 printf("%d\n", *p);//100 printf("%d", a);//100 system("pause");}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
①static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,例如:val_a、val_d、val_h、val_i。
②const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;const局部变量存储在栈中,代码块结束时释放,例如:val_j。
③全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放,例如:val_b、val_e。
④局部变量存储在栈中,代码块结束时释放,例如:val_h、val_i。
注:当全局变量和静态局部变量未赋初值时,系统自动置为0。
- c/c++const实现原理解析
- C指针原理(24)-const类型
- const c
- const【C++】
- const ||c
- C++Const
- [c++]const
- C++:const
- const与static原理
- const的实现原理
- C++ const实现原理
- C++ const原理
- const用法(C/C++)
- C++/C const问题
- 【c/c++】const引用
- C 语言的可变参数表函数的设计及原理 - printf(const char* format, ...)
- readonly vs. const [C#]
- C++(二)const
- 搜索引擎
- Java类的加载过程
- Android四大组件知识
- 关于Django模板报TemplateDoesNotExist异常
- bootstrap 实例大全
- C++ const原理
- Java常用设计模式
- bzoj1099
- 使用表单标签,与用户交互
- Linux知识整理
- JavaScript判断一个数组里面是否有重复数据(对jqgrid数据进行操作)
- 陈光标的刷APP平台代替测试工作了吗?
- 苹果Mac OS X显示隐藏文件的方法
- Cannot create directory /tmp. Name node is in safe mode