一.宏定义:用的时候将要代替的数加(),提高严谨性。
#define SEC_PER_YEAR(365 * 24 * 60 * 60) UL
#define AUO_CTR_SET_1(PA0 = 1)
二.枚举:实际是宏定义的一种优化(进化)。
举例:
#define SUN0
#define MON1
#define TUS2
可由下面枚举替代:
enum weak
{
SUN,
MON,
TUS,
};
三.结构体
1.定义结构体类型:
struct Mystruct
{
inf a;
char b;
float c;
};
2.定义结构体变量:
struct Mystruct s1;
s1 = {123,'s',1.0};
3.使用结构体变量:
s1.a =123;s1.b = 's';s1.c = 1.0;
4.结构体的对齐:
一般32位系统默认结构体变量成员是4字节对齐,这样访问速度最快。
则 struct Mystruct 类型占用内存:4+4+4
四:指针
数组指针:基本类型:int *p[5],本质是一个
五:内存
程序中变量在内存中主要分布在栈(static)、堆(heap)、数据段、bss段(ZI段)。
栈(static):系统自由分配,主要存储局部变量,使用完后立即释放,脏内存,使用时要初始化。
堆(heap):需要使用者自己申请。使用malloc()函数申请,使用完后用free()函数释放。
函数原型: void * malloc(申请字节数);
使用:int * p = malloc(1000*(sizeof(int)));申请1000个int型变量空间
访问:*(p + 1) = 23;
释放:free(p)
数据段:程序中显式初始化非零的全局变量和静态局部变量都分配在数据段。
bss段:也叫ZI 段zero initial,初始化为0或初始化时没有赋值的全局变量。
六:指针的应用
点阵显示字码数组:
uint8 code WeekMod[] = {
0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7, //星期日(红心)
0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, //星期一
0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81, //星期二
0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3, //星期三
0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF, //星期四
0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3, //星期五
0xC3, 0x81, 0xF9, 0xC3, 0x81, 0x99, 0x81, 0xC3, //星期六
0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7, //星期日
};
void ShowLedArray(uint8 *ptr)
ShowLedArray(WeekMod + CurTime.week*8); //星期
分析:WeekMod为数组名代表数组首元素的首地址,WeekMod + 1
七:十六进制数转十进制数
比如:0x12转十进制的时候可直接把第四位移出0x12>>4 = 0x01得到十进制的1,0x12&0x0F得到十进制的2。