抛出问题
下列代码输出的结果是什么?
#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。