const学习

最近发现在单片机的变成当中,const的使用挺频繁的,一旦被const修饰,那么这个常量就不能改变。 与#define有区别,主要与指针一同使用,接下来我们进行一些学习吧。

一、修饰局部变量

修饰局部变量一般有两种写法,但是你入股要对变量进行赋值的话,就一定要给变量初始化,否则就不能赋值了。

//这两种写法是一样的,包括数组的话这两种写法也是一样的
const int n=5;
int const n=5;
const int a[3]={1,2,3};

二、常量指针

常量指针是指针指向的内容是常量,有两种定义方法。就是不能更改指针所指向的内容,但是可以更改指针的地址

const int * n;
int const * n;
int a = 5;
const int *p =&a;
*p = 20;   //error  不可以通过修改所指向的变量的值

int b =20;
p = &b; //right  指针可以指向别的变量

三、指针常量

指针常量指的是这个指针本身是个常量,就不能随意更改指针的地址,也就是指针的地址是固定的,所以指针所指向的内容就可以随意更改。

//定义形式
int *const a;
int a = 5;
int *const p = &a;
*p = 20;     //right 可以修改所指向变量的值

int b = 10;
p = &b;      //error 不可以指向别的变量

指向常量的常指针

也就是将两者融合,就是既不能改变指针的地址,也不能更改指针所指向的内容。

const int *const p;

然后的话使用最多的场景就是函数的参数会带修饰。

四、修饰函数的参数

作为函数参数的话有三种使用情况。

4.1、防止修改指针指向的内容

void StringCopy(char *strDestination, const char *strSource);

这么一个函数,前面是输入函数的指针,后面是想输出的指针,我们给后面的指针变为常量指针之后,就是相当于我们在函数内部不能更改指针所指向的内容,只能对其指针进行修改,比如我们写好后,我们就可以将我们修改好后的指针的地址传入到这个指针当中,其实也相当于对内容进行了修改,只是变相的进行了修改。

4.2、防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 )

防止指针的地址被修改,但是能修改指针所指向的内容,我感觉这部分内容可能比较设计的多。

4.3/最后一种就是将这两种相结合

相当于就是指针所指向的地址和内容都不允许都不能被修改

修饰函数的返回值

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。 给出下面这个例子:

const char * GetString(void);
char *str = GetString();//error
const char *str = GetString();//right

本文章使用limfx的vscode插件快速发布