c语言和c++语言中const修饰的变量区别浅析
作者:是小明同学啊
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;分配内存。
如果是自定义的类型,比如类对象,分配内存。
总结
到此这篇关于c语言和c++语言中const修饰变量区别的文章就介绍到这了,更多相关c语言和c++中const修饰的变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!