一、指针
指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)
指针的基本操作:
定义指针 u8 *a; 写入数据 *a = 88; 移动指针 a=a+6; 数据调用 b=*a;
指针与数组的区别:
指针、数组都是在RAM空间中占用内存,只是表达的方式不同指针更有灵活性,不固定空间大小,可以游走于更大的空间。数组需要事先固定一个空间区域,只能在区域内操作。
注意: 这是相乘:a*b ;1 *b 这才是指针相加(乘):a+ * b ;a *(*b)
例
void OLED_DISPLAY_8x16_BUFFER(u8 row,u8 *str){ #定义*str指针
u8 r=0;
while(*str != '/0’) { #判断该地址的值不为空
OLED_DISPLAY_8x16(row,r*8,*str++); #指针值向后移一位
r++;
}
}
二、结构体指针
结构体: 1、定义:将不同类型的数据存放在一起,作为一个整体进行处理 2、结构体声明:
struct student
{
int age;
char sex;
float score;
.
.
};
调用后
int main ()
{
struct student a={ 18,'男',100};
printf("年龄:%d 性别:%c\n 分数:%.2f", a.age,a.sex,a.score);
return 0;
3、结构体指针 定义:
struct 结构体名 *结构指针名;
访问其中一个结构体元素的成员变量:
(*结构体指针名).成员名
三、宏定义#define
1、定义:指示编译器会将之后出现的所有标识符都替换为替换列表
2、类对象宏(无参宏):
#define 标识符 字符串
3、类函数宏(带参)
例如: #define A1(a,b) a+b
四、Typedef
1、定义:定义一种数据类型的别名,数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等) 2、可给变量一个易记且意义明确的新名字,,也可简化一些比较复杂的类型声明
typedef void (*PFunCallBack)(char* pMsg, unsigned int nMsgLen);
3、定义机器无关的类型,如定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度
typedef long double REAL;
在不支持 long double 的机器上,则该 typedef 为
typedef double REAL;
在连 double 都不支持的机器上,该 typedef为
typedef float REAL;
五、条件编译
1、
以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作 #if 条件语句 程序段1 //如果条件语句成立,那么就编译程序段1 #endif 程序段2//如果条件不语句成立,那么就编译程序段2 #ifndef x//先测试x是否被宏定义过 #define 程序段1 //如果x没有被宏定义过,那么就编译程序段1 #endif 程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。 #ifdef x //先测试x是否被宏定义过 程序段1 //如果x被宏定义过,那么就编译程序段1 #endif 程序段2 //如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。 if就是判断语句,不是预编译指令
2、
常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息
六、内存操作
进程: 进程是占有资源的最小单位,这个资源当然包括内存。在现代操作系统中,每个进程所能访问的内存是互相独立的(一些交换区除外)。而进程中的线程可以共享进程所分配的内存空间。 在操作系统的角度来看,进程=程序+数据+PCB(进程控制块)
七、补充
const:
1、定义const常量之后具有不可变性,const修饰的数据类型是指常类型,不可被更新 2、可以很方便地进行参数的调整和修改 3、与define定义不同,只是给出了对应的内存地址,而不是像define一样给出的是立即数,并没有放入放入ROM,不分配分配存储空间,是一个编译期间的常量,具有高效率。
|