const关键字在C语言中用于保护数据不被修改,即设置数据为只读模式。具体有以下几种用法:
1. const创建变量
const double PI = 3.1415926; /* const 变量 */
const int days[5] = {0, 1, 2, 3, 4}; /* const 数组 */
对于const变量和const数组,只能在定义的时候将其初始化,定义完成后即会变成只读模式,其他任何时候再去尝试改变其值都会造成编译错误。
例如,再将上诉的PI = 2.14;都是错误的,对于数组也是一样。
2. 对形式参数使用const:
在函数参数指针传递的时候,我们有时候只是想调用的函数使用参数的值而非改变它。对此,我们可以使用const关键字限定函数的形式参数,函数声明如下:
int function(const char *Str, int len);
对于function函数,参数Str的内容是在函数中是只读的,不允许被改变的。但在函数之外的位置却是一个允许读写操作的,不必将Str变量定义为const变量,以至于全局只读。这样既兼顾了数据的安全,也不妨碍其读写的自由。
3. const与指针
const声明的指针有三种:只读指针,位置固定指针,位置固定且为只读的指针。
int buffer[3] = {0, 1, 2};
const int *p1 = buffer; /* 只读指针 */
int *const p2 = buffer; /* 位置固定指针 */
const int *const p3 = buffer; /* 位置固定且只读指针 */
A. 只读指针
对于指针p1的定义方式,const修饰的是p1地址的数据,所以p1指向的数据为只读的,即只允许通过指针p1读取buffer中的值,而不允许修改。注意,p1是可以被修改的,即类似p1++;等操作是允许的,表示指向 buffer[1]。
B. 位置固定指针
对于指针p2,const修饰的是p2,即p2为只读的,即p2固定指向数组buffer的起始地址,不能被改变。一般用于记录某一关键位置。例如对p2 = &days[0]等操作都是会造成编译出错的。
C. 位置固定且为只读的指针
最后,在创建指针时还可以使用两次const,改指针既不能更改它所指向的地址,也不能修改指向地址的值,对于指针p3,一些操作都是不允许的:
p3 = &days[0]; /* 不允许 */
*p3 = 999; /* 不允许 */