const是一个C语言的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const关键字在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。另外const在其它编程语言中也有出现,例如Pascal、C++、PHP5、B#.net、HC08 C、C#等。
const 修饰的变量,称为常变量。在编译阶段,判断常变量是否做左值,其他处理和变量是一样的。
关于const修饰指针的情况,一般可以分为以下4种情况:
int b = 200;
const int* a = &b; // 情况1
int const *a = &b; // 情况2
int* const a = &b; // 情况3
const int* const a = &b; // 情况4
如果const位于 * 的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于 * 的右侧,则const就是修饰指针本身,即指针本身是常量。
1、情况1:
情况1和情况2相同,都是const位于 * 的左侧,即指针所指向的内容为常量( 与const放在变量声明符中的位置无关),这种情况下不允许对内容进行更改操作。
举例来说,如果a是一名仓库管理员的话,他所进入的仓库b,里面的货物(*a)是他没有权限允许动的,仓库里面的东西原来是什么就是什么。
int b = 200;
const int* a = &b;
*a = 300; //错误
但是也有办法去改变(*a)的值:
(1)通过改变b的值,进而改变(*a)的值。
int b= 200;
const int* a = &b;
b = 300;
cout << *a << endl; //得到300
(2)通过使a指向别处(管理员换个仓库),进而改变(*a)的值。
int b= 200,c = 300;
const int* a = &b;
a = &c;
cout << *a << endl; //得到300
对于情况1,可以先不进行初始化。因为虽然指针内容是常量,但指针本身不是常量。
2、情况2:
与情况1相同,在此不再赘述。
3、情况3:
const位于 * 的右侧,指针本身是常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。
举例来说,如果a是一名仓库管理员的话,他只能进入指定的某仓库,而不能去别的仓库(所以a++是错误的);但这个仓库里面的货物(*a)是可以随便动的。
此外,对于情况3,定义的同时必须初始化。
int b = 200,c = 300;
int* const a; //错误,没有初始化
int* const a = &b; //正确,必须初始化
*a = 600; //正确,允许修改*a的值
cout << a++ << endl; //a++错误
4、情况4:
对于情况4,为指针本身和指向的内容均为常量。
举例来说,该仓库管理员只能去特定的仓库,并且仓库里面所有的货物他都没有权限去改动。