一、const介绍
关键字const是C/C++中的类型限定符(qualified type),以const关键字声明的对象,其值不能通过赋值或递增、递减来修改,但可以初始化const变量。
二、用法说明
先来看一个简单的例子:
#include <stdio.h>
int main(int argc, char **argv)
{
const int a = 10; // work (initialization)
const int a; a = 10; // not work (assignment)
return 0;
}
正如上面的注释所说的那样,第一行代码可以工作,因为它是对"const int"类型的变量"a"初始化;而第二行代码不工作,因为它先定义了一个"const int"类型的变量,然后对"a"赋值。
用关键字const修饰普通变量和数组相对简单和容易理解,当用来修饰指针时,要复杂一些,因为需要区分是限定指针本身为const还是限定指针指向的值为const,再来看下面的例子:
#include <stdio.h>
int main(int argc, char **argv)
{
const char *a = NULL; // *a is const, but a isn't
a = argv[1]; // work (change a, not *a)
*a = argv[1]; // not work (change *a, not a)
return 0;
}
上面的例子中,const限定指针a所指向的值*a是不可变的,但指针a本身是可变的,可以随时指向其他的内存位置。
要想限定指针a本身不可变,将限定符const放在*的右侧即可,如下:
int * const a; // a is const
此时,指针a本身的值不可变,a必须指向同一个地址,但是它所指向的值可以改变。
三、总结
用const来限定普通变量,其值不可变。
用const来限定指针,需要注意区分是限定指针本身为const还是限定指针指向的值为const。当const放在*左边任意位置,限定了指针指向的数据不能改变;当const放在*右边,限定了指针本身不能改变。
最后的这个例子和编译错误提示很好的总结了以上几点:
#include <stdio.h>
int main(int argc, char **argv)
{
const int a = 10;
const int b; b = 10;
const int *pa = NULL;
pa = &a;
*pa = a;
int *const pb;
pb = &a;
*pb = a;
return 0;
}
error : assignment for read-only variable 'b'
const int b; b = 10;
error : assignment for read-only variable '*pa'
*pa = a;
error : assignment for read-only variable 'pb'
pb = &a;
参考资料:
<<C Primer Plus>>(Sixth Edition), by Stephen Prata. P.403