本文共 1871 字,大约阅读时间需要 6 分钟。
摘自百度百科:const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。
const英文中意为常量,但在ANSI C中,const修饰的是一个变量,其作用是使这个变量的值不再改变,const具有左结合性,即const+修饰对象
。
1.使用const
关键字可以防止变量被意外修改,增强程序健壮性。
const常量
,当a的值发生变化时程序会报错,方便程序员找出错误。 const int a = 2;a++;
(比如这段代码就会报错)
4.相比较#define
节省空间,避免了不必要的内存分配。就拿#define X 123;
和const int X=123;
来讲,俩个的作用似乎都是让X的值在程序中始终等于123,先来说#define X 123;
,宏定义X后,X每一次出现在程序中,都会分配到一段新内存空间。而const int X=123;
,编译器是不会为普通的const
分配内存,而是将它保存在符号表中,这就使const
修饰的变量在编译期间相当于一个常量,常量是不存在存储和读内存操作的,所以当const
变量出现在程序中时都是仅仅调用其内存地址的,不会再次给变量分配内存。 当const
修饰一般变量时有俩种形式:
const int a = 1;int const b = 2;
俩种操作的结果没有区别,都是使a、b变量的值不再改变,需要注意的是:由于const
使变量的值不能被改变,所以就要在变量初始化的时候进行赋值。
指针变量的俩个要点
int *p;
在这之前我们要明白定义一个指针变量时,* 和 p
分别代表这什么,*
是取值运算符。所以*p
代表指针指向的地址中的值,而p
代表指针指向的地址。也就是说指针变量要牢牢把住俩个点:
指针常量与常量指针
好,了解这俩个点之后这样就可以更好的掌握const
修饰指针变量的方法了。 int x = 1;int y = 2;const int *a = &x;//常量指针int const *b = &x;//常量指针int* const c = &x;//指针常量
指针常量:
int* const c = &x;//指针常量
指针常量中
const
修饰的是c,也就是地址,代表指针指向的地址不可变,但地址中的值是可变的。
- 在指针常量中,地址不变,值可以变
- 指针常量必须在定义的时候初始化
- 可以通过
x = 2
来改变值,但不可以改变地址
常量指针:
const int *a = &x;//常量指针int const *b = &x;//常量指针
常量指针中
const
修饰的是*a,也就是值,代表指针指向地址中的值不可变,但指针指向的地址是可变的。
- 在常量指针中,值不变,地址可以变
- 常量指针在定义的时候可以不初始化
- 可以
a = &y;
来改变地址,但x
的值不可以变
如果我们想函数的形参在函数中不被改变或者形参的地址不被改变,就可以使用const
修饰形参。
防止修改形参地址:
典型的例子就是FreeRTOS内核中对列表项(节点)的操作/* 节点初始化 */void vListInitialiseItem( ListItem_t * const pxItem ){ /* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */ pxItem->pvContainer = NULL;}
像FreeRTOS内核中的列表项(也就是节点)一样,有时需要对节点进行初始化,也就是修改节点中的内容,但又不能对节点的地址造成影响,如果函数对节点的地址进行修改的话,整个列表将会因此受到巨大的影响,所以当节点作为函数形参时要保证节点的地址不能被改变,只可以修改其中的值。
防止修改形参内容:
void f(int x,const char* source);
有时候传入函数的是一个源数据,在程序运行过程中源数据是不允许被修改的,所以我们在传入函数的时候利用const
对其进行修饰,让源数据的值不可变,这样函数在运行过程中就不会改变源数据的值了。
转载地址:http://bowzi.baihongyu.com/