对于const在C和C++中的不同,前面已经有所说明了
这里重点提一下:
什么情况下用const声明一个变量的时候,这个变量会在符号表中存储下来!!!
就是在定义的时候为这个变量赋值一个字面量!!!
例如:const int x = 1;// 这个时候的x就会进入符号表中去
如下情况:
int z = 1;
const int x = z;// 定义一个const属性的变量x的时候,给x赋值一个已经定义好的变量,那么x不会进入符号表,而是仅仅具有只读属性这个功能,每次去内存中取值
如下:
volatile const int x = 1;
被volatile修饰的const常量不会进入符号表,退化为只读变量每次从内存中取值
#include <stdio.h>
int main()
{
const int x = 1;// 将x的值放入符号表中,取x的值是在符号表中取的
int& rx = const_cast<int&>(x);// 将x去const属性后为x取一个别名rx,取rx的值是在内存中取的
rx = 5;
printf("x = %d\n", x);// 在符号表中取值,x = 1
printf("rx = %d\n", rx);// 在内存中取值,rx = 5
printf("&x = %p\n", &x);// 发现x和rx的地址是相同的
printf("&rx = %p\n", &rx);
// 结论:为含const属性的x取别名时,会为x分配一块内存空间。在访问那个别名的时候去内存空间中取值;但是在访问x的时候,是去符号表中取值的
volatile const int y = 2;
int* p = NULL;
p = const_cast<int*>(&y);
*p = 6;
printf("y = %d\n", y);// 输出结果y和*p的值一样,都是6
printf("*p = %d\n", *p);// *p是在内存空间中取值的, 因为y和*p相等,可以说明y是内存空间中取值的。否则y的值就是2,说明y是在符号表中取值的。这里y和*p的值相等,已经可以说明问题了。
// 结论:可以说明,为const属性的y加了volatile属性以后,取y值的时候是在内存中取的。这个时候的y只是一个只读变量,不能成为左值仅此而已
const int z = y;
p = const_cast<int*>(&z);
*p = 7;
printf("z = %d\n", z);// z和*p的值相同都是7
printf("*p = %d\n", *p);// 说明z是在内存空间中去取值的
// 结论:可以说明为const属性的z在初始化的时候赋值一个变量,那么这个z就是具有只读属性,不能成为左值仅此而已
char c = 'c';
char& rc = c;
const int& trc = c;// 利用const引用为c取一个别名,这个别名具有只读属性!!!仅仅是这个别名变量具有只读属性。“不同类型”的变量给const引用变量赋值会导致const引用变量具有只读属性。就是trc具有只读属性,而不是c具有只读属性
rc = 'a';
printf("c = %c\n", c);// c的值为a
printf("rc = %c\n", rc);// rc的值为a,rc变量是c变量的一个别名,操作rc变量其实就是操作c变量
printf("trc = %c\n", trc);// trc的值为c
// 结论:const引用的变量具有只读属性,“不同类型”的变量给const引用变量赋值会导致const引用变量具有只读属性。就是trc具有只读属性,而不是c具有只读属性
// 而本身const引用变量也就只是具有只读属性而已
return 0;
}
- 什么是符号表?
- 符号表存储在程序的哪个地方?
· 符号表是编译器在编译过程中产生的关于源程序中语法符号的数据结构
*如常量表、变量名表、数组名表、函数名表等等
·符号表是编译器自用的内部数据结构
·符号表不会进入最终产生的可执行程序中