zoukankan      html  css  js  c++  java
  • C++笔记017:C语言中 “冒牌货”const和const符号表

     


     原创笔记,转载请注明出处!

     点击【关注】,关注也是一种美德~ 


     

    在.c文件中有程序:

    int main()

    {

    int const a = 10;

    a=20;

    printf("a=%d ",a);

    return 0;

    }

     

    编译就知道C语言编译器会报错,说变量a是常量,常量是不能当左值的,这样看来,好像a是定义的一个常量,不能修改!

     

    修改程序:

    int main()

    {

    int *p;

    int const a=10;

     

    p=(int*)&a;

    *p=20;

     

    printf("a=%d ",a);

     

    return 0;

    }

     

    定义一个指向变量a的指针变量p,通过指针修改指针p所指向位置的值,也就是a的值,编译运行:

    a=20

    Press any key to continu

     

    我们发现a的值变成了20,被修改了!

    也就是说我们通过指针间接修改了a的值,也就是说在c语言中const是个“冒牌货”。

     

    同样的代码,我们运行在C++环境下:

    int main()

    {

    int *p;

    int const a=10;

     

    p=(int*)&a;

    *p=20;

     

    printf("a=%d ",a);

     

    system("pause");

    return 0;

    }

     

    运行结果:

    啊0

    请按任意键继续...

     

    发现运行结果跟C语言环境不同,在C++中并没有改变变量a的值。

    所以,在C++中,const是一个真正的常量。

     

    问题原因分析:

    因为C++编译器对const做了加强,当C++编译器扫描到const常量声明时,它不会像C语言一样为const单独分配内存。

    在C++中,int const a = 10;之后,C++编译器会将a放到一个符号表里面,符号表的存在形式:

    我们定义常量a=10,key就是a,value就是10,这个值就是锁死了,不能变的,当使用a的时候,就会从符号表里面把10拿出来。

    当对a变量取地址的时候,C++编译器会为a单独的开辟一块内存空间,p = (int *)&a;然后这个内存空间赋给指针p,就是p指向这个内存空间。

     

    通过*p去间接修改的值,是这个新开辟的内存空间的值,而不是符号表中a的值,我们让*p=20、30、100…修改的都是新开辟内存空间中的值。我们可以通过打印*p去验证这两个区域并不是一回事。

    int main()

    {

    int *p;

    int const a=10;

     

    p=(int*)&a;

    *p=20;

     

    printf("a=%d ",a);

    printf("*p=%d ",*p);

     

    system("pause");

    return 0;

    }

     

    运行结果:

    a=10

    *p=20

    请按任意键继续...

     

     

    结论

    C语言中的const变量

    C语言中的const变量是只读变量,有自己的存储空间。

    C++中的const变量

    可能分配存储空间,也可能不分配存储空间;

    当const常量为全局,并且需要在其它文件中使用时分配内存空间;

    当使用&操作符取const常量的地址分配内存空间;

     


      原创笔记,转载请注明出处!

     更多精彩请关注微信公众号:依法编程


  • 相关阅读:
    Vue3手册译稿
    Vue3手册译稿
    Vue3手册译稿
    Vue3手册译稿
    Vue3手册译稿
    Vue3手册译稿
    C# 多线程与异步的使用方法笔记
    PetaPoco 5.1.306 的生成模板加注释
    RichEditDocumentServer打印记录
    RichEditDocumentServer 打印份数
  • 原文地址:https://www.cnblogs.com/tyyhmtyyhm/p/8985565.html
Copyright © 2011-2022 走看看