1. const关键字引入
const 即是英文单词 constant 的缩写,常数、常量(在实际使用中,准确的说,应该是“只读”)的意思。在C语言中,const 用于修饰变量,那么程序员就是希望这个变量变为“常量”,但是这里加了引号,因为对于C语言来说,我们还是可以通过指针间接修改。
2. const修饰普通变量和指针变量
C语言中的 const 修饰变量有如下几个特定:
- const 修饰的变量只是只读的,本质他还是一个变量,并不是常量;
- const 修饰的局部变量在栈上分配内存空间;
- const 修饰的全局变量在只读存储区分配内存空间;
- const 只是在编译期起作用,在运行期间无效。
总的来说,在C语言中,const修饰的变量不是真的常量,它只是告诉编译器这个变量是不能出现在赋值符号的左边(作为左值使用)。
2.1 const修饰普通变量
const int a = 10;
int const a = 10;
a = 20;
上面两种写法都是一样的,const修饰变量a,那么意味着变量a不能通过赋值被改变,只能通过定义时初始化给一个初值。
2.2 const修饰指针变量
修饰指针变量,才是const玩法的精髓。有下面几种情况:
/* 这两种写法是一样的,const修饰的是p所指向的内存空间,就是指针p所指向的内存空间的值(或者是内容)是不允许被修改的 */
const int *p;
int const *p;
/* 这里const修饰的是指针p本身,就是指针所指向的地址是不允许被改变的。例如让指针指向其他地址空间,是不被允许的 */
int * const p;
/* 下面这两种写法意思一样。就是结合了上面的两种情况,指针p的指向不允许改变,指向的内存空间的值也不允许改变 */
int const * const p;
const int * const p;
一个阅读小技巧:去掉类型之后(比如上面的 int 类型),然后看 const 最靠近修饰哪个符号,比如先修饰 * 这个符合,就说明指针所指向内存空间的内容是不允许改变的,比如:const int *p; 。const 先修饰指针变量本身,那么就说明修饰的指针不允许改变指向的地址,比如:int * const p;
3. const修饰的变量是否真的不能改变?
前面说过,C语言中 const 修饰的变量具有的只读属性,是编译器通过语法检查来实现的,也就是说,我们在写代码的时候,骗过编译器,可以间接修改const变量的值。
3.1 C语言中const修饰局部变量的情况
#include <stdio.h>
int main(void)
{
/* 定义一个const局部变量 */
const


1045

被折叠的 条评论
为什么被折叠?



