• 空暇时候思考之const


    对于多数人来说那些const的使用方法比方修饰返回值和修饰參数都应该是十分好理解的下来我要讨论


    对于C语言中

    #include <stdio.h>
    
    void main()
    {
    	const int a=10;
    	int *p =(int*) &a;
    	*p = 100;
    	printf("%d
    ",a);
    }
    

    上边输出100

    对于C++中

    #include<iostream>
    using namespace std;
    
    void main()
    {
    const int a=10;
    int *p =(int*) &a;
    *p = 100;
    printf("%d
    ",a);
    }
    上边输出10


    原因是什么呢。C中为const是一个不能被改变的变量,有内存空间的分配,所以能够在内存中通过地址改变

    C++中的const是一个常量,通常是保存在字符表中,不分配内存。仅仅是在方位该变量的时候或者查看变量的地址的时候就会又一次分配一个同名变量与const的常量的值同样,所以此时输出的地址是这个新变量的地址。所以通过地址改变的还是这个变量的值。可是输出的时候编译器还是会在符号表里面读取这个常量的值,所以值未改变


    const int size;

    //c中const默认外部链接这里仅仅是一个声明而已

    const int bufsize = 100;
    char buf[bufsize];//这在C语言中是非法的,由于c语言中bufsize是一个不能改变的变量
                     //可是这在C++中合法的。由于C++中不为bufsize建立存储空间。仅仅是存储在符号表中
                      
    //可是C++中const默认内部连接,假设要在多编译单元中使用必须设置为
    extern const int bufsize=100;    //改为外部连接,此时就是强制为const创建空间
    extern const int bufsize;//这在c++中仅仅是声明,仅仅能在初始化的时候才分配内存
    //在c++中一个const不必建立空间,可是c中const必须建立空间    
     
    const int i[] = {1,2,3,4};//集合不能保存到符号表中。所以仅仅能也必须分配内存
    float f[i[3]];//编译期间的值是不能使用的。由于编译期间编译器就不知道存储器的内容
    struct S
    {
        int i;
        int j;
    };
    const S s[] = {{1,2},{3,4}};

    int main()
    {

    }

  • 相关阅读:
    关于python2.7的md5加密遇到的问题(TypeError: Unicode-objects must be encoded before hashing)
    Spring @Resource、@Autowired、@Qualifier区别
    互联网秒杀设计--转载
    学习动态性能表(5)--v$session
    学习动态性能表(4)--v$sqltext&v$sqlarea
    学习动态性能表(3)--v$sql&v$sql_plan
    学习动态性能表(2)--v$sesstat
    学习动态性能表(1)--v$sysstat
    Oracle备份与恢复案例
    日梭万年历网络版
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6939726.html
走看看 - 开发者的网上家园