const关键字在C代码中很常见,下面总结一下其作用:
1、将一个变量声明为常量,即只读的。这一点跟#define 是相似的,如: const int a;
这时候,a就被视为一个常量,具有不可修改的性质。这个声明的问题是没有对a初始化,编译器给a分配的空间,以前是什么值,默认就是什么值,所以以后要给a赋值会报错。
恰当的声明应该是这样的: const int a = 3;
即,声明的同时进行初始化。需要注意的是,int const a = 3; 效果是一样的,在这种情形下,const和数据类型的位置可以颠倒。
2、修饰指针变量
稍微介绍一下指针。指针就是地址,而所谓地址,就是一串数字,但是这个数字却标示了内存中的一个存储单元。要知道内存中的每个存储单元都是有编号的。当然,存储单元里面存放的内容本质上也是一串数字,但必须搞清楚,存储单元的编号和内容不是一回事,或者说没有什么关系,因为它们的解读方式不同。
由于表示地址的数字太长,不容易记忆,所以C语言使用了变量名称来代替这个数字。可以知道,在编译阶段,每个变量名称都是要最终替换成某个“数字地址”的,也就是说,变量名和某个存储单元的地址是绑定的、对应的。
先看第一种情况: int *const a; 那么a是一个变量,存放一个指针类型的数据,即地址值。这个地址值所代表的存储单元存放一个int型数据。现在a被const修饰了,于是有些东西不能修改了。那么到底是a中存放的那个地址不能修改还是这个地址对应的存储单元里面的数据不能改?答案是前者,即a中存放的只能是某个地址,不能改,只与这个地址中存放什么值无所谓,随便改。用代码表示的话,a不能再赋予其他地址值,但是 *a 可以随便赋值。a 和 *a
分别代表什么大家都很清楚。
第二种情况:const int *a; 这个时候,不能改的不是a中的那个地址值,而是这个特定的地址中的内容不能改,与上一种情况正好相反。于是,a可以再赋予其他地址值,但是a的值没有改变之前,*a 是不能改变的。(注:int const *a和这种声明效果一样,所以本质区别是*号挨着变量还是const)
第三种情况:const int *const a; 显然,谁都变不了了。
3、修饰函数形参
这种经常见于函数的形参是数组或指针的情况,为了防止函数修改传递过来的数组内容或指针内容(2中的第二种情况)被意外修改,于是加上const限定,如:int FindNum(const int array[], int num, int conut);
4、待补充。