c语言和c++语言中const修饰的变量区别浅析

来自:网络
时间:2022-08-07
阅读:
目录

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;分配内存。

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

总结

返回顶部
顶部