目录
  • c:
    • 修饰全局变量:
    • 修饰局部变量:
  • c++:
    • 修饰全局变量:
    • 修饰局部变量:
  • 总结:
    • 在c语言中:
    • 在c++语言中:
  • 总结

    c:

    修饰全局变量:

    用const修饰的全局变量是没有办法直接修改的,间接的修改也是不成功的(语法可以通过,但是编译运行的时候会报错。)(const只要是修饰全局变量,那么就会储存到常量区中,收到常量区的保护。)

    修饰局部变量:

    但是如果用const修饰局部变量,同样的也是没有办法直接修改的,但是是可以间接修改的。

    int main()
    {
        const int b = 10;
        int* p = &b;
        *p = 20;
        pirntf("%d",b);
        return 0;
    }
    

    这样就不会报错。(const修饰的局部变量是储存到栈上,相当于分配到内存上,可以修改成功)。

    通常叫这种变量为伪常量,不能用这种常量不能构成数组。arr[伪常量]这种写法是错误的。

    c++:

    修饰全局变量:

    const修饰全局变量的效果是和c语言的一样的。无论是直接修改还是间接修改都是报错的。

    修饰局部变量:

    const修改局部变量,直接修改是不成功的,不会报错,但是输出的结果是修改前的值,相当于没有修改。因为在c++中,const修饰的无论是局部变量还是全局变量都是常量了。数组的初始化可以使用这个const修饰的变量了。

    int main
    {
        const int a = 100;
        int* p  = (int *)&a;
        *p  = 200;
        cout<<a<<endl;//100
        return 0
    }
    

    输出的结果依然是100,注意给p指针赋值的时候需要将&a进行强制类型转换(c++的要求,因为这个时候&a的类型是const int*)

    剖析这个代码:

    int *p = (int *)&a

    实际上是int temp = a 先在栈上创建了一个和a的值一样的变量temp,

    当对const修饰的局部变量取地址的时候,编译器会给变量分配临时的内存空间,这个内存空间就是temp的内存空间。而给p赋值的时候就是将这个临时变量的空间的地址赋值给了p。

    也就是int*p = &temp然后p指针指向的也就是temp,所以说后来的*p = 200改的就是temp而不是a的值。临时空间没有什么意义。

    (const int a =100写出来了以后就一直放在符号表中(键值对一一对应着不会改变。))

    总结:

    在c++语言中,一个const修饰的变量不是必须创建内存空间的,c语言中,总是需要一块内存空间。

    在c语言中:

    对于全局变量:

    将const修饰的全局变量存储在只读数据段,保存在符号表中,第一次使用的时候再分配内存,程序结束的时候释放。(这个是不能修改的,因为存储在只读数据段中)

    对于局部变量:

    将const修饰的局部变量存储在栈中,代码块结束的时候释放。(这个是可以修改的,在栈上)

    在c++语言中:

    对于全局变量:

    是否为const变量分配内存空间取决于const变量的用途。如果是作为一个值(用这个值去替换一个函数名),就不分配空间。如果是对这个全局变量取地址,那么会分配内存,存储在只读数据段。两种都是不能进行修改的。

    对于局部变量:

    如果是const int a = 100;直接放进符号表中,不分配内存。如果对其取地址的话,在栈上分配内存空间temp,修改不成功,因为修改的只是temp的值,对在符号表中的a没有影响。

    如果是const int a = b;分配内存。

    如果是自定义的类型,比如类对象,分配内存。

    总结

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。