1. const关键字的作用
- const创建只读变量;
- 对函数形参使用const以保护数据;
- const与指针;
- 非const指针转换为const指针。
1.1 const创建只读变量
记住一点:const创建的不是常量,而是只读变量,相当于给变量赋予了常量的属性。C语言一般只有(1)字符常量;(2)#define宏定义的常量;(3)enum枚举常量。
下面的代码验证了const定义的不是常量而是变量。
#define MAX_LEN1 10//#define定义的是常量
int main(void){
const int MAX_LEN2=10;//const定义的是变量
int arr1[MAX_LEN1];//arr1的定义可以完成
int arr2[MAX_LEN2[;//C语言不允许使用变量定义数组长度
return 0;
}
1.2 对函数形参使用const以保护数据
使用指针进行参数的传递时,使用const定义函数的形参可以避免形参在函数中被改变,也相当于提醒了其他开发人员,这个函数不会对传入数据进行修改,C语言的库函数中很多都使用了const定义函数形参,这是一种保护数据的方式,也是很好的代码习惯。
//此函数定义未使用const保护传入参数,在函数体内的错误操作可能导致传入数据产生意想不到的改变
int sum(int ar[], int n)
//使用const关键字修饰ar数组,可以告诉函数使用者,本函数不会修改传入数组的数据,起到保护数据的作用
int sum(const int ar[], int n)
1.3 const与指针
可以参考下面的定义和操作:
int a=248, b=4;
int const c=21;
const int *d=&a;
int *conste=&b;
int const *f=&a;
c=32;//被禁止,编译器提示“表达式必须是可以被修改的左值”,其实就是说c是常量,不能修改
d=&b;//可以执行,*d是const表示d所指向的内存空间不可以被修改,但是d本身可以被修改
*d=43;//被禁止,参考上一条注释
e=34;//这里有两个问题,首先e是const,不能修改,另外e是int*类型,不能赋int类型的值
e=&a;//e是const,不能修改
*e=12;//这个是可以的,因为e是const,但是e指向的变量可以被修改
f=&b;//这个是可以的,*f是const,表示f指向的变量不能被修改,但是f本身可以被修改
在创建const指针时还可以使用两次const,定义的指针其本身不能被修改,也不允许修改其指向的内存空间的值。
double rates[2]={88.99, 100.12};
const double* const pc=rates;
pc=&rates[2];//不允许,pc是const指针
*pc=92.99;//不允许,pc指向的值也是const
1.4 非const指针转换为const指针
C语言中非const类型的指针可以默认转为const类型的指针,不需要我们显式地操作。但是不建议将const指针转为非const指针,这可能导致异常。