关键字const“是用来定义常量的,而C语言中的宏定义#define也可以用来定义常量,先来说一下二者的区别:
(1)#define的原理是对值在程序的预编译阶段进行替换,替换时并不会对值进行类型的检查
像下面这种情况编译是不报错的
下面说一下const的几种用法;
1.const修饰局部变量
应用场景一般是:在程序中,不想让某一变量被修改,但是开发过程中有可能不下心将其修改了,这时候如果没有使用const对这个变量进行修改的话,等到程序出错再找就会很麻烦,而使用const修饰之后,在开发过程中仍然一不小心将其修改了的话,程序在编译的时候就会报出错误,就可以及时发现和定位错误;
const int a = 10;
int const b = 20;
以上两种写法是一样的,都是表示变量的值不能被修改了,在这里要注意一点,用const修饰变量时,要一块给变量赋上初值,否则就无法进行赋值了,而局部变量的值如果不赋初值的话,它将会是一个随机值,这将会很危险;
const char* str = "abcde";
上面这种写法是用const修饰常量字符串;
2.修饰全局变量
全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。
3.const修饰指针变量
使用const修饰指针变量的用法比较特殊,在这主要分为两种情况
(1)常量指针,有两种定义的方式
const int * n;
int const * n;
常量指针;const写在*前面(指针指向的值是一个常量),表示的是不能通过这个指针来改变指针指向的变量中的值,但是并不影响通过其他的方式来改变变量中的值,还有一点要注意的就是这个指针的指向是可以改变的;
(2)指针常量
int * const n;
指针常量:const写在*后面(指针本身是一个常量),表示的是指针指向的地址不能被改变,指针指向的地址中保存的数值之可以改变的
(3)指向常量的常指针
const int * const n;
是上面两种用法的综合(指针的指向不能改变,指针指向的地址中的值也不能改变)
4.const修饰函数参数(与const修饰指针用法类似)
(1)防止通过该指针修改指针指向的地址中的内容
void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误
(2)防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 )
指针p1和p2指向的地址都不能修改
(3)以上两种用法的综合
5.const修饰函数返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
const char * GetString(void); //声明函数
char *str = GetString(); //错误用法,编译报错
const char *str = GetString(); //正确用法,用同类型变量进行接收