关于修饰词const

const在编程中经常遇到,包括全局变量和局部变量的修饰,函数参数的修饰,函数返回值的修饰等,下面我们来一步步的回顾下有关const关键词的一些用意和疑问,并重新梳理一下const是何许人也?

1. const修饰的只读变量必须在定义的同时初始化;
因为如果没有被赋初值,那么变量被编译器分配了一个空间,并且赋给默认的一个值,一般是很大的一个负数,当我们再次给这个const变量赋值的时候就会出现错误,这个变量是只读的,一旦被赋值了就不能再改变了。

 

2. case后面不可以是const修饰的只读变量,因为case之后只能是常量;

3. 函数的参数中的有const关键字,例如:
void fun(const int *a, const int *b)
{
    statement;
}
这个参数不是定义,是声明而已,函数在调用的时候传递参数,同时给const变量赋值,这个过程是一个整体,而不是分化。另外,const告诉编译器,a,b的值在函数体内不能被改变。声明除了函数的参数外,还有一种关于const变量的声明:extern const int a;注意这里只是声明,而不是定义。

 

4. const和define的区别:const效率更高;
const变量在编译期间,编译器通常不为它分配内存空间,而是将他们保存在符号表中,例如:
#define LEN 3  //宏常量

const int MAX = 5; //此时并未将MAX放入内存中

....

int i = MAX; //此时为MAX分配内存,以后不再分配
int j = LEN; //预编译期间进行宏替换,为LEN分配内存
int k = MAX; //不再为MAX分配内存
int m = LEN; //再次进行宏替换,又一次为LEN分配内存

 

5. const修饰的位置不同意义也不同:
(1)修饰一般简单只读变量:
a. const int i = 2;等同于int const i = 2;
b. const int a[2] = {0,1};等同于int const a[2] = {0,1};
(2)修饰指针变量:
a. const int *p; // p可以变,p指向的对象不可变;
b. int const *p; // p可以变,p指向的对象不可变;
c. int *const p; // p不可以变,p指向的对象可以变;
d. const int *const p; //指针p和p指向的对象都不可以变;

6. 修饰函数返回值:
例如:const int fun(void);表示函数的返回值是不能被改变的,函数是一个只读函数。


拓展:有关const的几个疑问,从网上找了相关的答案,高人指点的很好,学习一下:
1.存储位置:对于一个const类型的局部变量,真的是分配在“只读数据段”?还是和普通局部变量一样在栈上分配内存?
解答:只读数据段仅是实现的其中一种方式,目的是在运行时令试图修改const变量的行为产生错误。由于C标准并没有禁止对const变量的修改,而是规定属于未定义行为,因此一个实现对于试图修改const的行为如何处理都没有违反标准,也就是说,无论把const变量放在只读段也好,放在可被修改的地方也好(例如你说的栈),都是允许的行为。

 
2.生命周期:“只读数据段”,是和静态变量一样程序运行前就分配好内存,程序退出时才释放内存,生命周期是整个程序运行时间?
解答:NO,只读数据段与生命周期无关。


3.对于一个const类型的局部变量,如const int a=1;1这个值是在编译期间就确定的,还是到运行时才确定的?
解答:这要分抽象语义和实现语义,对于抽象语义,a必定是运行时才确定的,抽象语义才是a的本质;而对于一个实现,如果确定代码的其它地方并没有使用a的运行期信息,例如没有使用a的地址等,编译器也可以选择将a的值隐式作为字面值处理,即是说,编译器在实现a的语义时可以灵活处理,只要能表现出a的抽象语义即可。


4.问题1,3对于const类型的全局变量呢?
解答:问题1的处理是一样的,但全局变量不可能在栈中。而对于问题3,全局变量的值在编译期是确定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值