c语言和c++中const修饰的变量
是小明同学啊 人气:0c:
修饰全局变量:
用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;分配内存。
如果是自定义的类型,比如类对象,分配内存。
总结
加载全部内容