关键字const是用来定义常量,如果一个变量被const修饰,那么它的值不能再被改变,这一点上作用和define 一致。但是const存在的意义不止于此。
const修饰符有以下的优点:
- 预编译指令只是对值进行简单的替换,不进行类型检查
- const可以保护修饰的变量值,防止意外修改,增强程序健壮性
- 编译器一般情况下不给const修饰的常量分配存储空间,而是做在一个符号表中,这样其就变成了一个编译期间的常量,没有存储和读取内存的操作使得效率很高
修饰局部变量
① 修饰变量
const int n=5;
=
int const n=5;
以上这两种写法是一致的,但是需要注意的是,这一步一定要进行赋值,否则后面没有赋值的机会了。
② 修饰常量静态字符串
const char* str = "fdisk"
对比
str[4] = "fdisk"
后者更容易遭到篡改,但是用const修饰程序在编译时可以立即检查出错误。在编译期间就可以发现问题。
常量指针和指针常量
const在左边是常量指针,const在右边是指针常量**
常量指针
const int * n;
=
int const * n;
① 常量指针是说不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值
int a =5;
const int * n = &a;
a = 6;
② 常量指针指向的值不能改变,但是这个并不意味着指针本身不能改变,常量指针可以指向其他地址
int a = 5;
int b = 6;
const int* n = &a;
n = &b
指针常量
指针常量意味着指针本身是常量,不能指向其他地址
int * const n;
同样,需要注意的是,指针常量指向的地址不能改变,但是地址中保存的值是可以改变的
int a = 5;
int *p = &a;
int * const n = &a;
*p = 8;
意思就是用另一个普通指针去修改指针常量指向的位置是可以的。
指向常量的常指针
那么结合以上情况,焊死指针和指针指向的值就为如下形式:
const int* const p;
修饰函数的参数
① 防止修改指针指向的内容
void StringCopy(char *strDestination, const char *strSource);
② 防止修改指针指向的地址
void StringCopy(char *strDestination, char * const strSource);
③ 防止修改指针指向的地址以及防止指针移位
void StringCopy(char *strDestination, const char * const strSource);
修饰函数的返回值
如果是以“指针传递”方式的函数返回值增加const修饰,那么函数返回值就是指针的内容不能被修改,该返回值只能被赋值给同样const修饰的指针
const char * GetString(void);
const char * str = GetString();
修饰全局变量
全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。