嵌入式学习DAY15 --- 结构体,共用体,枚举,字节序(大小端)

嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY15

概述:
1、结构体
2、共用体
3、枚举
4、大小端
5、条件编译(书写头文件)----》工程目录

笔记:

1、结构体:----》关键字:struct
概念:可以存放多种数据类型的集合,跟数组类似,只不过比数组更兼容
注意:结构体是一种构造数据类型
定义格式:----》如何构造一个结构体类型
struct 结构体名
{
数据类型1 成员1;
数据类型2 成员2;

数据类型n 成员n;
};

如何利用构造好的结构体类型定义一个变量?

回顾:之前如何定义变量?
数据类型 变量名;

定义结构体变量的格式:
struct 结构体名 结构体变量名; / 结构体类型 结构体变量名;

如何访问结构体中每一个成员?
(1)方式一:
变量名.成员名;
(2)方式二:
指针变量名->成员名;

#include <stdio.h>

//构造一个结构体类型
struct Car
{
	char Card[20];
	char Color[20];
	int passger;
}car;


int main(int argc, const char *argv[])
{
	printf("sizeof(CAR) = %d\n",sizeof(struct Car));
	//定义结构体指针变量
	//CAR car;//定义结构体变量
	struct Car *pCar = &car;//将结构体变量的地址赋值给结构体指针变量

	printf("plese input the car messages:\n");
	scanf("%s%s%d",pCar->Card,pCar->Color,&pCar->passger);
	printf("输出该车的信息为:\n");
	printf("车牌号: %s\t颜色: %s\t核载人数: %d\n",pCar->Card,\
			pCar->Color,\
			pCar->passger);
	return 0;
}


结构体指针:
如何定义一个结构体指针?

格式:
结构体数据类型 * 指针变量名;

如何利用结构体指针访问结构体中的每一个成员?
—》通过方式二即可!----》指针变量名->成员名

内存对齐:
在32OS下,定义结构体时,会按照当前结构体中占字节空间最大的来进行分配
32OS下最大只能按照4字节分配,(double相当于分配空间时按照两个4字节进行分配空间)

总结:定义结构体时,将占用空间大的类型写在前面可以减少内存的使用情况。

结构体数组:
格式:

结构体数据类型 数组名[元素个数];

#include <stdio.h>

#define N 5
#define SIZE 3
//实现定义一个结构体,用来存放5个学生的信息

typedef struct student
{
	char name[20];
	int age;
	float score[SIZE];
}Stu;


int main(int argc, const char *argv[])
{
	printf("size = %d\n",sizeof(Stu));
	//定义一个结构体数组
	Stu arr[N] = {{'\0',0,0}};
	int i,j;
	printf("请输入%d个学生的信息:\n",N);
	for(i=0;i<N;i++)
	{
		scanf("%s%d",arr[i].name,&arr[i].age);
		for(j=0;j<SIZE;j++)
		{
			//scanf("%f",&arr[i].score[j]);
			//scanf("%f",(arr+i)->score+j);
			//scanf("%f",&((arr+i))->score[j]);
			scanf("%f",&((arr+i)->(*(score+j))));
		}
	}

	printf("学生的信息为:\n");
	for(i=0;i<N;i++)
	{
		printf("%s  %d  ",arr[i].name,arr[i].age);
		for(j=0;j<SIZE;j++)
		{
			//printf("%.1f",arr[i].score[j]);
			//printf("%.1f  ",*((arr+i)->score+j));
			printf("%.1f  ",(arr+i)->score[j]);
		}
		printf("\n");
	}

	return 0;
}

#include <stdio.h>

//定义一个学校的结构体
struct university
{
	char school[20];
	char department[20];
	int career;
};

//定义一个热巴的结构体类型
typedef struct Dlireba
{
	char name[20];
	float height;
	struct university State;
}Reba;

int main(int argc, const char *argv[])
{
	//利用Reba定义一个变量
	Reba rb;
	printf("请输入演员的信息:\n");
	scanf("%s%f%s%s%d",rb.name,&rb.height,rb.State.school,rb.State.department,&rb.State.career);
	printf("打印的信息如下:");
	printf("%s %.2f %s %s %d\n",rb.name,rb.height,rb.State.school,\
			rb.State.department,rb.State.career);
	return 0;
}

#include <stdio.h>

//定义一个学校的结构体
/*struct university
{
	char school[20];
	char department[20];
	int career;
};*/

//定义一个热巴的结构体类型
typedef struct Dlireba
{
	char name[20];
	float height;
	//struct university State;
	struct university
	{
		char school[20];
		char department[20];
		int career;
	}State;

}Reba;

int main(int argc, const char *argv[])
{
	//利用Reba定义一个变量
	Reba rb;
	printf("请输入演员的信息:\n");
	scanf("%s%f%s%s%d",rb.name,&rb.height,rb.State.school,\
			rb.State.department,&rb.State.career);
	printf("打印的信息如下:");
	printf("%s %.2f %s %s %d\n",rb.name,rb.height,rb.State.school,\
			rb.State.department,rb.State.career);
	return 0;
}


2、共用体:关键字:union
概念:多个成员共用同一片内存空间
注意:分配空间时以占字节最大的那个成员为准进行分配

定义格式:----》如何构造一个共用体类型
union 结构体名
{
数据类型1 成员1;
数据类型2 成员2;

数据类型n 成员n;
};

#include <stdio.h>

//定义一个共用体
typedef union AA
{
	int a;
	short b;
	char c;
}Type;


int main(int argc, const char *argv[])
{
	//定义共用体变量
	Type aa;
	aa.a = 98;
	printf("aa.a = %d\n",aa.a);
	printf("aa.c = %c\n",aa.c);
	aa.c = 'k';
	printf("aa.a = %d\n",aa.a);
	printf("size = %d\n",sizeof(Type));

	return 0;
}

3、枚举—》和宏常量比较类似
关键:enum----》一般被用来做错误码多一点

定义格式:----》如何构造一个枚举类型
enum 枚举名
{
成员1,
成员2,
。。。
成员n
};

注意:枚举中的成员值默认从0开始,后面依次累加1
如果想要修改,则直接在其成员后面赋值即可,那么后面的值也在其新值基础之上累加1

#include <stdio.h>

//定义一个枚举类型

enum ERRORNU
{
	MALLOC_ERROR,
	ERROR = -2,
	OK
};


int main(int argc, const char *argv[])
{
	printf("%d %d %d\n",MALLOC_ERROR,ERROR,OK);	
	return 0;
}


4、大小端(字节序)
大小端:大端存储/小端存储

大端存储:低字节处的内容存储在高地址处,高字节序的内容存放在低地址处
小端存储:低字节处的内容存储在低地址处,高字节序的内容存放在高地址处

#include <stdio.h>

union AA
{
	int a;
	short b;
	char c;
};
int main(int argc, const char *argv[])
{
	
	union AA aa;
	aa.a = 0x12345678;
	char *p = (char *)&aa.a;
	int i;
	for(i=0;i<4;i++)
	{
		printf("%#x\n",*(p+i));
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值