一、面试中常见关键字
1 :static:
定义:改变生命周期,限制作用域,
对于:在函数内部声明为内部静态变量只需要初始化一次。变量类型由auto变成STATIC,使变量存储在静态区延长生命周期至整个程序结束,扩大其作用域为全局可见。
修饰全局变量加STATIC,限制其作用范围,使嘚外部程序不可访问
修饰函数时,也是和全局变量一样,使得外部程序不可访问。
存放空间:静态存储区
生命周期:从定义开始,直到程序运行结束。
作用域:当前文件可见,其他文件不可访问。
2、extern
外部变量声明
修饰变量时,声明这个变量为外部全局变量。可用于变量在本程序外定义或在声明下面被定义声明。
修饰函数时也是一样的。
3、register
寄存器变量
当你的某个数据频繁的被cpu访问时,你可以使用regiater修饰,这样整个变量就会被放在cpu的寄存器里面用以提高访问速率,要注意的是,寄存器变量不可以使用取地址的操作。cpu内部寄存器,没有地址。而且cpu内部寄存器是有限的比如我们的EXYNOS4421卡发班只有好像是40个吧——R0~R15,还有各个模式下的专用寄存器。以及cpsr。所以很多寄存器都有专门的用途。只有少数几个能被用来存放变量,尽量少用,但是改用还是的用。
4、const:
限定修饰符,常用于变量不可被改变的时候。(我们采用const后面的不可以被改变的方法判别)
用法: //在判别过程中不用看数据类型的位置,当它不存在就完事了
指向常量的指针——const int *p; 简化后 const(p)所以p不可以被改变
_______________ int const *p: *p就是指针指向的地址存放的东西,那这个东西不可以变所以它是都是指向常量的指针
2) 常指针——char *const p;简化后 *const§ p不可以被改变说明了,指针存放的地址不可以被改变。而地址里面存放的内容可以被改变。
3) 指向常量的常指针——const char *const pc='a’ :简化后const(*const(p)) p不可以被改变 *p也不可以被改变。地址内容不可以被改变,指向地址的指针也不能被改变
5、volatile:
编译器警告提示字:防止编译器优化:编译器一般都数据都是直接从缓存中读取,但是对于易变的变量,这种做法就比较危险,对数据加上volatile:修饰让编译器从数据的内存地址中去读取数据。
被誉为区分嵌入式程序员和c程序员的最基本方法
在嵌入式的开发中常用于:
1、中断服务程序中的修改的,可被其它程序使用的变量。比如我中断会操作一个全局资源,而其它程序会检测这个资源并使用,如果不加volatile,那么一般编译器会把这个共享资源放在缓存中方便读取,但是我一个中断来了,这个值已经变了,而编译器还是从缓存中读取整个数据。这肯定是不得行的。
2、多任务环境中各任务间共享的资源
3、存储器映射的硬件寄存器通常也要加volatile
——————————————————————————————————————————
二、构造数据类型
1、结构体:
struct 声明结构体变量。
常见声明有:注意区分类型和定义
设计结构体类型的时候,同时取别名
1、typedef struct A{
int a;
int b;
}st_t;
st_t 是一个结构体类型,它实际上是struct A的别名,此时除了struct A可以定义变量外,还可以通过st_t来定义(常用)
2、struct A{
int a;
int b;
}st;
这个st是一个结构体变量,可以通过struct A结构体类型来定义变量
设计结构体类型的时候,同时定义结构体变量
3、struct{
int a;
int b;
}st;
这个st是一个结构体变量,且以后无法在使用结构体来定义变量 (内核使用)
4、typedef struct{
int a;
int b