【C语言零基础入门篇 - 10】:自定义数据类型

自定义数据类型

含义:用户自己建立的数据类型

类别:结构体、共用体、枚举类型


问题:

		比如,有5个学生,我们要保存他们的信息,这些信息包括学号、姓名、考试成绩。

		我们如何写代码保存数据呢?

结构体类型声明

结构体:由不同类型数据组成的组合型的数据类型
为什么使用结构体:方便保存某类数据,比如学生、老师、班级等。

类型声明格式:

struct 结构体类型名
{
	成员1;
	成员2;
	.......
}

在这里插入图片描述

结构体变量定义与访问成员

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

结构体变量定义格式二:在声明类型的时候定义变量

注:在格式二中,可以省略结构体类型名;相同类型的结构体变量可以相互赋值。

结构体变量访问成员:变量名.成员名

  • 结构体变量的定义
    在这里插入图片描述
    在这里插入图片描述

  • 访问成员,方式:变量名.成员名
    在这里插入图片描述

结构体变量的初始化

结构体变量的初始化:

	struct 结构体类型名 变量名={初值1,初值2};

注意:初值的赋值要按照顺序
在这里插入图片描述

typedef取别名

typedef取别名:

	(1) typedef 类型 别名;

	(2)typedef struct 类型名
			{		成员列表		} 别名;

注意:别名可以理解成小名。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结构体的嵌套

//学生
struct  student
{
	int id; //学号
	char name[20]; //姓名
	float score; //分数
}; //STU1是struct student的小名

//老师
struct teacher
{
	int t_id; //老师的编号
	struct student stu; //学生 定义学生变量,作为老师的成员
	char t_name[20]; //老师的名字
};

//班级
struct class
{
	int c_id; //班号
	char c_name[20]; //班级名称
	struct teacher t; //定义老师变量作为成员
};

在这里插入图片描述

结构体数组

结构体数组的定义:

	(1) struct 类型名 数组名[数组长度];

	(2)在声明结构体类型时,定义结构体数组。

结构体数组访问成员格式:

	数组名[下标].成员名
	//学生
	typedef struct  student
	{
		int id; //学号
		char name[20]; //姓名
		float score; //分数
	}STU; 
	STU stu[3]; //stu是数组,是struct student类型的数组
	//数组元素相当于变量
	//数组名[下标].成员名
	stu[0].id = 1;
	strcpy(stu[0].name, "刘备");
	stu[0].score = 100.0f;

	stu[1].id = 2;
	strcpy(stu[1].name, "关羽");
	stu[1].score = 90.5f;

	stu[2].id = 3;
	strcpy(stu[2].name, "张飞");
	stu[2].score = 80.5f;

	for (int i = 0; i < 3; i++)
	{
		printf("%d  %s  %.2f\n", stu[i].id, stu[i].name, stu[i].score);
	}

在这里插入图片描述
结构体数组的初始化:

	struct 类型名 数组名[数组长度]={
			{初值11,初值12,......},
			{初值21,初值22,......},
			 ......
		} ;

在这里插入图片描述

结构体的大小

对齐机制:往最大的类型对对齐

  • 例1
    在这里插入图片描述
    在这里插入图片描述
  • 例2
    在这里插入图片描述
    因为最大的字节为八个字节(double),首先先分配八个字节给int,但是int只使用了四个字节,后面还有四个字节装不下double,于是又分配八个字节给double,刚好装满,最后还有一个char,再分配八个字节给char,但是char只占一个字节,最后还有7个字节未使用。结果导致共有11个字节未使用,造成资源浪费。
    在这里插入图片描述
  • 例3:消除资源浪费——把大的类型往上放
    在这里插入图片描述
    因为最大字节为八个字节(double),首先会分配给八个字节给double,double刚好装满,再分配八个字节给int,int只占四个字节,剩余四个字节,而char只占一个字节,刚好可以装下,只剩余三个字节未使用。
    在这里插入图片描述

共用体

共用体的含义:相同的内存,存放不同的变量(成员)

共用体的特点:所有成员共用里面最大成员的空间,同一时刻,只能保存一个成员值。

注:共用体在语法上与结构体是一致的,只不过内存结构不一样。

共用体类型的声明:

	union 共用体类型名
	{				成员列表;		};

共用体变量的定义:

	与结构体变量的定义一致,只不过关键字不同

共用体变量访问成员:

	共用体变量名.成员名

在这里插入图片描述
数据发生改变的原因是因为int和char有公共的内存空间,当给char的变量赋值时,会修改内存数据,也就是把之前写入的id值修改了
在这里插入图片描述

枚举类型

枚举的含义:把所有的可能都例举出来,然后再进行一个选择。
枚举类型的使用:为了提高程序的可读性、可维护性。
内存大小:与int一样大。

枚举类型的声明:

	enum 枚举类型名{枚举列表};

注意:枚举列表是常量,里面的常量使用符号表示,并且可以在声明时赋值。默认情况:从0开始,依次加1。

在这里插入图片描述
如果right没有赋值,则会根据前面left加一,也就是Ascii码值加一
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

街 三 仔

你的鼓励是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值