关键字const常常被用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。但是C语言中不是有#define用来宏定义一些变量吗,c语言中为什么要设计出const呢。其实事实上const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点:
1.预编译指令不能进行类型检查,只是对值进行简单的替换,所以相较于const常量有数据类型,宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
2.可以保护被修饰的东西,防止程序员编程中的意外修改,从而起到增强程序的健壮性。
3.编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没了存储与读内存的操作,使得它的效率也很高。
4.与宏定义一样可以很方便地进行参数的调整和修改,一改全改。
下面我将从几个方面来说一下const的用法:
一,修饰局部变量
![](https://img-blog.csdnimg.cn/img_convert/8fbc2bf5ee49dfcd4311e8b569cbcdc3.png)
不论const是放在类型名前还是后起到的作用是一致的,都是表示局部变量不能被修改了
tips:const修饰的局部变量一定要进行初始化。
二,修饰全局变量
全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。
三,常量指针与指针常量
区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。
常量指针是指 针指向的内容是常量,可以有以下两种定义方式。
![](https://img-blog.csdnimg.cn/img_convert/9b729607a43ddf44028533e7fbdf3822.png)
常量指针不能通过这个指针改变变量的值,也不能通过该指针修改指向的内容,如下
![](https://img-blog.csdnimg.cn/img_convert/44057621bab83366703faa96949f524f.png)
tips:
1.常量指针说的是不能通过这个指针改变变量的值,
但是还是可以通过其他的引用来改变变量的值的。
2.常量指针指向的值不能改变,
但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
3.指针常量是指 指针本身是个常量,不能在指向其他的地址。
![](https://img-blog.csdnimg.cn/img_convert/30d3f170d671017cddde387eb9d94484.png)
tips:
指针常量指向的地址不能改变,但是指向地址中保存的数值是可以被其他的指针进行修改的。
![](https://img-blog.csdnimg.cn/img_convert/eae42c02c1584f4ca71f38268f1c1855.png)
指向常量的常指针
是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。
四、修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
![](https://img-blog.csdnimg.cn/img_convert/889a8b83e4c486cfbe21a758a5ad8f55.png)
如果是用第一种写法接受函数的返回值那么编译器将会报错。
————————————————