嵌入式Linux C(十二)——复合数据类型

一、struct结构体

struct 定义结构体类型:

  • 第一个字母大写;
  • {}后面有;
  • 结构体名一定能体现结构体的作用(自注释性)
  • 最好写在全局,或者写在头文件(结构体定义在函数内部,只能由该函数调用)
  • 不可以保存函数,但是可以保存函数指针
  • .或者->访问结构体变量的成员
  • 初始化(野指针问题、直接给数组名赋值(指针常量))
  • 结构体之间的赋值:浅拷贝;—>深拷贝
    浅拷贝(自己写)
    释放两次
    在这里插入图片描述
    深拷贝?
    在这里插入图片描述
//深拷贝
void copy_struct(struct student * s1, const struct Student *s2)
{
	(*s1).num = (*s2).num;
	(*s1).age = (*s2).num;
	int len = strlen((*s2).num);
	(*s1).name = (char *)malloc(sizeof(char) * len + 1);//+1为了'/0'
	strcpy((*s1).name,(*s2).name); 
}
struct Student
{
	int num;
	char name[30];
	//char *name;
	int age;
	void (*fun)();
};
void print()
{
	printf("hello world");
}
//初始化:
struct Student stu = {1,"zhangsan",12,printf};
struct Student stu2 = {.num = 1,.name = "zhangsan",.age = 12,.fun = print};

//定义结构体指针
struct Student *pstu = &stu;   

struct Student stu2 = {
	.num = 1,
	.name = "zhangsan",
	.age = 12,
	.fun = print
};
printf("stu.num = %d\n",stu.num);
printf("stu.num = %d\n",(*pstu).num);//`()`一定加,优先的.高,所以加上括号
printf("stu.name = %d\n",(*pstu).name);

printf("stu.num = %d\n",pstu->num);//`->`前后不能有空格
printf("stu.num = %d\n",(&stu)->num);

struct Student stu3;

scanf("%d",&(stu.num));
//stu.name = (char *)malloc(sizeof(char) * 100);
//if(NULL == syu.name)
//{
//	printf("malloc error!\n");
//	exit(1);
//}
//scanf("%s",stu.name);
//stu.name = "zhangsan";//数组名不能赋值,是常量
strcpy(stu.name,zhangsan"")
scanf("%d"&(stu.age));

//free(stu.name);

struct Student stu4;
//stu4 = stu;

copy_struct(&stu4,&stu3)
free(stu3.name);
free(stu4.name);

1. 使用注意事项:

字对齐,导致的内存空洞,将相同类型放在一起

结构体的作用:封装数据(打包数据) — 抽象数据

字(4个字节)对其的方式(默认处理方式)(等于4个字节)
ch1 —> 4
num —> 4
ch2 —> 4
首先会为第一数据分配一个字,再看下一时,分析上一个剩余空间是否够用,不够用则新开辟空间
双字(8个字节)对其的方式(默认处理方式)(大于4个字节)

struct node
{
	char ch1;
	int num;
	char ch2;
};

//特殊
struct node
{
	char ch1;
	short b;
	char ch2;
	int num;
};是12个字节

struct node
{
	
	short b;
	char ch1;
	char ch2;
	int num;
};是8个字节

#pragma pack(4) 4个字节对齐
#pragma pack() 恢复默认

2.struct数组


struct Student
{
	int num;
	char name[20];
	int age;
}

typedef struct Student Stu;

int main
{
	Stu AStu[3] = {
		{
			.num = 1,.name = "zhangsan",.age = 12
		},
		{
			.num = 2,.name = "lisi",.age = 13
		},
		{
			.num = 3,.name = "wangwu",.age = 14
		}

	};

	for(int i = 0; i < sizeof(AStu) / sizeof(Stu); i++)
	{
		printf("num = %d, name = %s , age = %d\n",AStu[i].num,AStu[i].name,AStu[i].age);
	}
}

3.柔性数组

struct node
{
	int len;
	int src[0];
};

typedef struct node Array;

int main()
{
	printf("sizeof(node) = %d\n",sizeof(struct node));
	Array a;
	a.len = 100;
	a.src = (char *)malloc(sizeof(char) * 100);
	
	a.src = (char *)realloc(sizeof(char) * 原有字节长度);

}

4.作业???

封装函数

二、union共用体

union定义类型,定义变量和指针、初始化
struct VS union:大小
union大小:保存的成员中最大字节长度的成员所决定:(保持字对齐)
存储方式:所有成员公用一段内存空间(最长字节数的变量)(数据覆盖)

  • CPU属性:大端字节序、小端字节序
  • 利用共用体判断CPU的大小端字节序
    在这里插入图片描述

在这里插入图片描述
多选一
在这里插入图片描述

三、enum枚举

enum:定义一系列整数宏
枚举变量 == 整型变量
enum VS #define
enum:定义一些列整数宏更加便捷,在编译阶段
#define :预处理,不安全,做傻瓜式替换

enum Result
{
	OK,
	NO,
	SUCCESS,
	FAILED
};
#define OK 0
#define NO 1
#define SUCCESS 2
#define FAILED 3
posted @ 2022-01-24 08:06  周末不下雨  阅读(16)  评论(0编辑  收藏  举报