08——const的基础用法

/*
    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

猜你喜欢

转载自blog.csdn.net/WUZHU2017/article/details/81173420
今日推荐