/*
C语言中的const变量是一个冒牌货
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
以下两种情况分配内存空间
a、当const常量为全局,并且需要在其它文件中使用
b、当使用&操作符取const常量的地址
*/
/*
c++ 中把const 变量存储在符号表中
符号表
key value
a 10
当使用a时,从符号表中把10拿出来让你使用
当对变量a取地址时,c++编译器会为a单独的分配内存空间,指针p
指向这块新的内存空间
*/
#if 0
void test()
{
//a已经存在符号表中了
const int a = 10;//等价于 int const a =10;
//a = 11;
int *p = NULL;
p = (int *)&a;//此时会给a单独分配一个内存空间
*p = 20;//间接赋值,修改的是新的内存空间的值,与符号表中的a = 10 没有任何关系
printf("a = %d\n", a); //a = 10
printf("*p = %d\n", *p);//*p = 20 证明了c++中的const是一个常量
}
#endif
/*
const变量内存分配内存的时机:编译期间
*/
#if 0
void test()
{
int a = 10; //&a:921697508
const int b = 20; //&b:921697540
int c = 30; //&c:921697572
//b的地址在a和c之间,说明是在编译期间就分配内存了
printf("&a:%d &b:%d &c:%d ", &a, &b, &c);
}
#endif
/*
#define 在编译预处理阶段 处理
const 常量是由编译器处理的,提供类型检查和作用域检查
const在c++中用来替换define的一个方法
*/
#if 0
void test()
{
//int a = 10;
//int b = 20;
//int array[a+b]; //linux内核里面是成立的;原因 编译linux内核的gcc编译器支持.
//c和c++编译器 不支持这种语法现象
const int c = 10;
const int d = 20;
// #define d 30
int array2[c + d];//编译能通过,是一个真正的常量
}
#endif
#if 1
void fun1()
{
#define a 10
const int b = 20;//const定义的变量是有作用域的
//#undef a 可以取消宏的作用域
}
void fun2()
{
printf("a = %d\n", a);//宏定义是机械的替换
//printf("b = %d\n", b);
}
void test()
{
fun1();
fun2();
}
#endif