在C语言中const关键字用来修饰一个变量,它限定一个变量不允许被修改。
const int max_size = 5;
看起来使用const修饰的变量,和使用宏很类似,为何不直接使用宏呢?
#define MAX_SIZE (5)
这是因为和宏比起来:
1. const修饰的是一个变量,所以会在代码编译阶段进行语法检查。
而宏只会在预编译阶段进行简单的替换动作;
2. 使用const修饰的是一个变量,具有具体的数据类型,所以编译器会进行类型检查。
3. 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
以常见的strcpy函数为例,
#include <string.h>
char *strcpy(char *dest, const char *src);
使用const修饰了char *src参数,这表示在strcpy函数内部是不能向src这个char指针指向的位置写入数据的。
如果有写入数据,则编译器就会报错。
4. 可以节省内存空间,避免不必要的内存分配。
因为const修饰的是变量,所以在内存中只有一份拷贝;
而宏定义只会在预编译阶段进行简单的替换动作,所以使用宏的地方都会被替换掉。
关于使用const的几个问题:
1. const int count = 10;
int array[count] = {0};
以上,编译器会报错。
原因是ANSI C规定数组定义时长度必须是常量;
而const修饰的仍然是一个变量。
2. const修饰内容的规则,特别要注意的是const修饰指针时很容易困惑人的.
(1)const char* src;----这里const修饰的是*src,即src指针指向的内容不能被修改,但指针本身可以随意指向;
(2)char* const src;----这里const修饰的是src这个指针,src指针指向了这个地方就不能动了,但是内容可以被修改。
所以关键点是:const只修饰其后的变量。
在(1)中,const修饰的变量是*src,*src是char类型数据;
在(2)中,const修饰的是src,src是char*类型数据。
再一次感觉到存储器空间布局的重要性,后面一定要找时间学习这一块。
推荐阅读:
C++ 隐式类类型转化 Implicit Class-Type Conversions
《C语言从入门到精通》.(王娣,韩旭 ).[PDF] + DVD视频光盘文件