开始学习ESP32,今天先回顾一下一些知识点
位操作
c语言躲不开的位操作,很多数据处理都需要用到位操作
| 运算符 | 含义 | 速记 |
|---|---|---|
| & | 按位与 | 全1为1 |
| | | 按位或 | 有1为1 |
| ^ | 按位异或 | 10为1 |
| ~ | 按位取反 | 翻转 |
| << | 左移 | 左移,右侧补0 |
| >> | 右移 | 右移,左侧按符号位填充 |
实例
int a = 60;//00111100
int b = 13;//00001101
int c = a&b;//00001100
int d = a|b;//00111101
int e = a^b;//00110001
int f = ~a;//11000011
int g = a<<2//11110000
int h = a>>2//00001111
宏定义
宏定义是预处理指令的一部分,宏可以是一个简单的常量、一个带有参数的表达式或是一个代码块。使用宏可以在编译前替换代码中的特定部分,从而实现代码的重用、简化和提高可读性。
无参数的宏定义
#define a 1234.5
带参数的宏定义,可以输入一个或多个参数,返回一个表达式
#define a(x) ((x)*(x))
代码块宏定义
#define SWAP(a, b) do { \
typeof(a) temp = a; \
a = b; \
b = temp; \
} while (0)
取消宏定义
#undef a
- 宏定义只是简单的文本替换,没有类型检查或作用域限制。
- 宏可能会因为参数的运算符优先级导致预期之外的行为,所以使用时要特别小心。
- 宏定义可能会导致代码膨胀,因为每个宏的使用都会导致相同代码的重复插入。
- 避免在宏中使用复杂的表达式或逻辑,因为这会增加代码阅读和维护的难度。
- 使用宏时要谨慎,以避免出现意外的副作用或难以调试的错误。
外部申明extern
extern 其实就是起到一个被文件外的文件调用的作用
extern int a=9;
- extern 只能用于声明变量或函数,不能用于定义。定义会分配内存空间,而声明不会
- 当你在一个源文件中定义了一个变量或函数,并想在另一个源文件中使用它时,你需
要在第二个源文件中使用 extern 进行声明 - 外部声明必须在使用变量或函数之前进行
- 在链接阶段,链接器会查找所有extern声明的定义,如果找不到,就会出现链接错误
- 如果多个源文件定义了同一个extern变量,那么链接器会将其视为错误,因为同一个变
量只能有一个定义。但是,多个源文件可以包含同一个extern函数的声明,因为这个函
数可能在不同的地方有不同的实现
类型别名typedef
用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
结构体struct
结构体就是一堆变量的集合,结构体中的成员变量的作用一般都是相互关联的,
struct man
{
uint8_t name;
uint8_t hight;
}
如果变量定义过多,如果某几个变量是用来描述某一个对象,可以考虑将这些变量定义在结构体中,这样也许可以提高你的代码的可读性
指针*
指针是一个值指向地址的变量(或常量),其本质是指向一个地址,从而可以访问一片内存区域,可以使不同代码共享同一片内存数据,也可以用作复杂的链接性的数据结构的构建,比如链表,链式二叉树等,而且,有些地方必须使用指针才能实现,比如内存管理等。
char *str = "hello world";
上面展示了一个指针的创建,这个时候,str就变成了一串数字,用于指向内存地址,通过
*str
可以读取数据,通过&可以指向地址
评论区