关键字:
数据类型关键字:
unsigned, singed, char, short, int, long, double, float, enum, union, struct, void
控制类型关键字:
swtich, case, default, if, else, goto, for, while, do, break, continue, return
存储类关键字:
static, const, extern, register, auto
其他关键字:
typedef, voliate, sizeof
数组和指针:
int a;----------------------一个整型数
int *a;---------------------一个指向整型数的指针
int **a;--------------------一个指向指针的指针,它指向的指针指向一个整型数
int a[10];-----------------一个有10个整型数的数组
int *a[10];----------------一个有10个指针的数组,该指针指向一个整型数
int (*a)[10];--------------一个指向有10个整形数数组的指针
int (*a)(int);-------------一个指向函数的指针,该函数有一个整型参数并返回一个整形数
int (*a[10])(int);--------一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整形数
关键字static:静态声明
变量:函数内的变量,在函数被调用过程中值维持不变;模块内的变量,可以在本模块内任意调用,但不可被模块外调用
函数:模块内有效,不可被模块外调用
关键字const:只读修饰符
使用const增加代码可读性,紧凑代码
const int a;-----------一个常整型数a
int const a;-----------一个常整型数a
const int *a;----------一个指向常整型数的指针a(指针指向的整型数不可修改,指针可修改)
int *const a;----------一个指向整型数的常指针a(指针指向的整型数可修改,指针不可修改)
int const *const a;--一个指向常整型数的常指针a(指针指向的整型数不可修改,指针不可修改)
*(int * const)(0x67a9) = 0xaa55;-----设置绝对地址为0x67a9的变量的值为0xaa55
const与#define区别
const定义的变量必须带类型。存放在静态区,编译时确定值,程序运行时只拷贝一次。
#define定义的变量是没有类型的。在预编译阶段替换,程序运行时每次调用都要拷贝
typedef与#define区别
typedef struct s * tDps;
#define dDps struct s *;
tDps tp1, tp2; =======>tp1, tp2都为结构体指针
dDps dp3, dp4; =====>dp3为结构体指针,dp4为结构体
voliate:值会不经意间的修改
ISR服务访问的非自动变量a
只读寄存器,const voliate regState
多线程中被共享的变量
inline:
内联函数,调用频繁,增加效率,牺牲代码空间
宏和函数优缺点:
函数调用时,先求出参数的值,再代入形参。宏只是简单的替换
函数调用是在函数运行时,分配临时内存单元。宏是在预编译时替换,调用时只是进行简单的字符替换
函数的形参和实参都要类型,宏不存在类型问题
宏只是简单的替换
内存对齐:实质是内存按字节对齐
#progma pack(N) //告诉编译器按N字节对齐;N值尽可能的为1,2,4,8
#packed //去掉对齐
不同平台。多见于不同平台的移植
性能因素。