嵌入式C学习 2


一、指针

指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(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);//声明引入了 PFunCallBack 类型作为函数指针的同义字,该函数有两个类型分别为 char* 和 unsigned int 参数,以及一个类型为 void 的返回值。

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,不分配分配存储空间,是一个编译期间的常量,具有高效率。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值