嵌入式学习Day16(结构体,共用体,位运算)
1、结构体:是一种用户自定义的数据类型,允许将不同类型的数据组合在一起。
// 定义结构体类型 注意:结构体名首字母大写,花括号末尾有分号,结构体可嵌套。
struct 结构体名
{
数据类型 成员1;
数据类型 成员2;
// ...
};
(1) 点运算符 (.):直接访问结构体成员。. 操作的是结构体变量本身
语法:结构体名.变量名 例如:S.id S.name
箭头运算符(->):通过指针访问结构体的成员。-> 操作的是指向结构体的指针
语法:结构体指针->成员名 例如:S -> number
通常情况下指针效率高,大小根据操作系统来,64位系统是8字节,若值传递,频繁调用函数,导致大量内存复制,效率降低。
(2)结构体成员存储时具有有序性,遵循在代码中的定义顺序,后一个成员的地址一定在前一个成员之后。
(3)内存对齐:内存对齐是指数据对象在内存中的起始地址必须是某个数值(通常是2、4、8等)的整数倍。
存入时,结构体:1.默认按CPU位数对齐,若8字节最终大小必须为8的整数倍
2.结构体成员中找到最长成员,最终按照该成员长度对齐
3.找按结构体声明的顺序,依次将成员保存到结构体内存中
struct Example {
char a; // 1字节,偏移0
int b; // 4字节,需要偏移是4的倍数
double c; // 8字节,需要偏移是8的倍数
};
2、共用体:允许在同一个内存位置存储不同的数据类型。共用体的所有成员共享同一块内存空间,因此同一时间只能存储其中一个成员的值。
union Deme
{
int i;
short s;
char c;
};
特点:
- 共用体的大小取决于最大的成员的大小。
- 共用体的成员共享同一块内存空间,只能同时存储其中一个成员的值。
- 对共用体的任何成员的修改都会影响到其他成员。
- 共用体的成员可以具有不同的数据类型,但它们在内存中的起始位置是相同的。
3、枚举:是一种用户自定义的有范围的数据类型,用于定义一组具有离散值的符号常量。枚举使得代码更加可读和易于理解,提高了代码的可读性和可维护性。
enum 枚举名 {
枚举值1,枚举值2, ...枚举值N //枚举值本质上是整型常量
}; //默认情况下,第一个枚举值为0,后续值依次递增1
4、typedef:是在C语言中的一个关键字。作用是为现有的数据类型(int、float、char……)创建一个新的名字,目的是为了使代码方便阅读和理解。
typedef int NEW_INT; //给int起了一个新的名字NEW_INT
当要定义int类型数据时: NEW_INT num; //此时NEW_INT num 等同于 int num
5、位运算:在计算机内部,数是以二进制的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。
(1)按位与 i&j 有一个为0则为0,双1才是1,作用是指定位置清零
(2)按位或 i | j 只要对应的两个二进位有一个为1,结果位就为 1。 作用:指定位置1
(3)按位异或 ^ 对应的两个二进位相异时,结果位为 1,二进位相同时则结果位为 0。(指定位置翻转)
(4)取返运算 ~ 对二进制数的每个二进位取反,使数字 1 变为 0,0 变为 1。 (全翻转)
(5)左移运算符 << 将二进制数的各个二进位全部左移若干位。<< 右侧数字指定了移动位数,高位丢弃,低位补 0。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)