嵌入式软件开发高频面试题
文章目录
- 一、关键字const
- 二、关键字static
- 1. 静态局部变量
- 2. 静态全局变量或函数
- 三、关键字volatile
一、关键字const
声明一个不可修改的变量,即常量
const将变量声明为“只读”,初始化后不能再通过该变量名修改其值。
intmain(){constinta=0;//const变量必须在定义的时候初始化//a = 20; //不可改变}小思考题:
const int *p 、 int * const p 、const int * const p的区别
//常量指针 : 指针的指向可以修改,但指针指向的值不能改inta=10;intb=10;constint*p1=&a;//常量指针p1=&b;//*p1 = 20;//报错,指针指向的值不能改//指针常量 : 指针的指向不能改,但指针指向的值可以修改int*constp2=&a;*p2=20;//p2 = &b;//报错//constint*constp1=&a;//指向常量的指针常量//p1 = &b;//报错//*p1 = b;//报错//二、关键字static
1. 静态局部变量
使局部变量在函数调用之间保持其值
#include<iostream>using namespace std;intret(){staticintcnt=0;//return++cnt;}intmain(){cout<<ret()<<endl;//输出1cout<<ret()<<endl;//输出2cout<<ret()<<endl;//输出3return0;}2. 静态全局变量或函数
限制全局变量或函数的作用域为当前文件,其他文件不可通过extern访问
#include<iostream>using namespace std;//extern int a; //非法操作intmain(){//cout << a << endl;//不可访问}//定义于另一个文件staticinta=0;三、关键字volatile
“防优化”
告诉编译器 该变量的值可能在程序正常流程之外被意外修改,要求编译器每次要从内存中读取,而不是直接使用寄存器中的值
intflag=0;//中断标志位//假设此时有个中断voidinterrupt(){flag=1;}intmain(){while(1){if(flag){flag=0;}//编译器认为在while循环里flag未被修改,于是将 flag 的值读入寄存器//之后每次判断都直接使用寄存器中的值(始终为 0),即使中断修改了内存中的 flag,循环也检测不到变化test();}return0;}小思考题:
为什么这样使用 volatile int * const p ?
int *const p 指针常量 指针指向地址不变,地址里的内容是可以发生改变的,volatile要求编译器每次都要从该地址内存中取出内容
典型应用场景:
1、中断与主程序之间共享的标志位
2、硬件寄存器的访问