const关键字用法

简介

摘自百度百科:const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。
const英文中意为常量,但在ANSI C中,const修饰的是一个变量,其作用是使这个变量的值不再改变,const具有左结合性,即const+修饰对象

优点

1.使用const关键字可以防止变量被意外修改,增强程序健壮性
2.可以方便进行变量的调整修改,在代码中达到一改全改的效果(类似宏定义)。
3.防止程序出错,有时候程序中需要使一些变量的值不变,所以需要定义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变量出现在程序中时都是仅仅调用其内存地址的,不会再次给变量分配内存。

用法

1.修饰变量

const修饰一般变量时有俩种形式:

const int a = 1;
int const b = 2;

俩种操作的结果没有区别,都是使a、b变量的值不再改变,需要注意的是:由于const使变量的值不能被改变,所以就要在变量初始化的时候进行赋值。

2.修饰指针变量

指针变量的俩个要点

int *p;

在这之前我们要明白定义一个指针变量时,* 和 p分别代表这什么,*是取值运算符。所以*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的值不可以变

3.修饰函数形参

如果我们想函数的形参在函数中不被改变或者形参的地址不被改变,就可以使用const修饰形参。

防止修改形参地址
典型的例子就是FreeRTOS内核中对列表项(节点)的操作

/* 节点初始化 */
void vListInitialiseItem( ListItem_t * const pxItem )
{
	/* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
	pxItem->pvContainer = NULL;
}

像FreeRTOS内核中的列表项(也就是节点)一样,有时需要对节点进行初始化,也就是修改节点中的内容,但又不能对节点的地址造成影响,如果函数对节点的地址进行修改的话,整个列表将会因此受到巨大的影响,所以当节点作为函数形参时要保证节点的地址不能被改变,只可以修改其中的值。

防止修改形参内容

void f(int x,const char* source);

有时候传入函数的是一个源数据,在程序运行过程中源数据是不允许被修改的,所以我们在传入函数的时候利用const对其进行修饰,让源数据的值不可变,这样函数在运行过程中就不会改变源数据的值了。

发布了62 篇原创文章 · 获赞 188 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43743762/article/details/99684070