嵌入式程序员const、static、volatile三个关键字的朴素认识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/windsnow1/article/details/87929904

嵌入式程序员const、static、volatile三个关键字的朴素认识

摘要:
在C语言程序编写中,const、static关键字是比较熟悉的,volatile关键字是比较少见的。但是在嵌入式工程开发中,const、static、volatile都是很常见的,我们嵌入式程序员需要熟知这三个关键字的恰当用法。下面是我参照网路上的大咖,大牛的博文,然后做一些代码测试,撰写一下自己的体会。欢迎大家一起交流讨论。

const:
const修饰的变量是常变量,只有读权限,无写权限。read_only。修饰的函数是常函数。
几点认识:
const修饰的变量需要同时初始化

	const int a;

[Error] uninitialized const ‘a’ [-fpermissive]
正确的是 const int a = 0;
数据类型对于const是透明的

int const a = 0; <=> const int a = 0;
const int *p1 = &a; <=> int const *p1 = &a

const用于封锁直接修饰的内容

const int a = 10;  //封锁a a的值不可写
const int *p1 = &a; //封锁的是*p1 不可修改*p1 指针指向的内容不可修改 指针指向可以修改
int * const p2 = &a; //封锁的是p2 指针指向的内容可以修改 指针指向不可修改 为常指针
const int * const p3 = &a; //封锁的是p3 和 *p3 指针指向 和 指针指向的内容都不可修改

关于const一个很有意思的demo:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 2;
	const int *p1 = &a;
	a = 1;
	printf("%d %d %d\n",&a,&b,p1);
	printf("%d %d %d\n",a,b,*p1);
	p1 = &b;
	b = 3;
	printf("%d %d %d\n",&a,&b,p1);
	printf("%d %d %d\n",a,b,*p1);

	return 0;
}

这段代码是能够编译通过的,编译结果如下:

6487572 6487568 6487572
1 2 1
6487572 6487568 6487568
1 3 3

我们来看代码:const int *p1 = &a, 指针p1的指向可以修改,但是指向的内容不可修改。可以看到p1指向的地址和a一样,我们不能通过*p1的内容去修改a,但是修改a的内容却可以修改*p1。p1 = &b,表示指针指向可以改变,但是不能通过*p1改变b的内容,但是通过修改b的内容可以修改*p1。

static
static修饰的变量是静态变量,修饰的函数是静态函数。在C++中,修饰的变量也叫类变量,修饰的函数也叫类函数或类方法。这些变量或函数属于整个类。
在C中,
static【局部】修饰函数体内的变量,可以延长局部变量的生命周期。函数一般是在栈中执行的,每一次调用,入栈出栈后变量都会经历定义到销毁,不会保存上一次的值。但是static修饰的变量是放在堆中,不会经历函数调用的生命过程。

static【全局】修饰函数体外的变量,或者修饰函数。都是只能在当前的源文件中被访问,其他的文件不能访问。当多个模块中有重名的对象出现时,不防用static修饰。

static修饰的变量没有初始化时,默认为0。

volatile
volatile修饰的变量是这变量可能会被意想不到地改变,这样编译器就不会假设这个变量的值了。精确地说,编译器优化的时候每次都从变量的内存地址读取,而不是从寄存器或者cache缓存中读取。以下是volatile使用的场合:
并行设备的硬件寄存器(状态寄存器)
一个中断服务子程序中会访问到的非自动变量
对线程任务中被几个任务共享的变量。

以下是网路上各路大神博文的链接:
https://blog.csdn.net/qq_40874221/article/details/79855317
https://blog.csdn.net/yayawy/article/details/51425889
https://blog.csdn.net/gao1440156051/article/details/51003295
https://wenku.baidu.com/view/5636db1bccbff121dd3683ca.html
https://www.cnblogs.com/reality-soul/p/6140192.html

欢迎各路大神一起交流,指出文章的不足,希望得到大家的指正。加油。

猜你喜欢

转载自blog.csdn.net/windsnow1/article/details/87929904