C和C++的const关键字总结

C语言:

在C语言中用const去修饰一个变量,表示这个变量是只读的,不可通过显式的调用a去修改a的值,却可以隐式地通过指针等操作修改a的值,并且此时a仍然是一个变量,不能等同于常量;

 怎么理解 隐式地通过指针等操作修改a的值 这个概念呢?请看:

const int a = 1;
int *p = &a;
*p = 2;

 虽然a不能直接被赋其它值,但是可以通过指向它的指针——p,通过*p来修改a的值。

const只会修饰离它最近的数据类型

怎么判断 最近的数据类型 这个概念呢?请看:

const int * p;//修饰的是int ,意味着数据类型为int的*p不能修改
int const * p;//等价于上一条语句
int* const p;//修饰的是int *,意味着数据类型为int *的p不能修改

我的理解是,从const开始往前或者往后遍历,一旦遇到关键字(如int),此时遍历结束,const就会修饰遍历得到的数据类型。

如例子中第一行,往后遍历到int之后,*之前,那么它修饰的数据类型就只是int而不包括*

例子中的第三行,往前遍历到int之前,也就是行首位置,它修饰的数据类型包括整个int *,和往后遍历不一样。

C++:

        C语言和C++中的const有很大区别。

        在C语言中用const修饰的变量仍然是一个变量;而在C++中用const修饰过后,就变成常量了,任何时候都不可以被修改。

        这就是c++的常量折叠(constant folding),即将const常量放在符号表中,而并不给其分配内存。编译器直接进行替换优化。除非需要用到a的存储空间的时候,编译器迫不得已才会分配一个空间给a,但之后a的值仍旧从符号表中读取,不管a的存储空间中的值如何变化,都不会对常量a产生影响。(实际上,如果想要通过指针修改const修饰的常量,g++直接以类型不匹配而报错,而gcc只是警告)

        但是在c中却不是这样.c没有constant folding的概念,用constant定义一个常量的时候,编译器会直接开辟一个内存空间存放该常量。不会进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值