【C语言】自定义类型(结构体/枚举体/共用体)

目录

结构体

结构体的定义

typedef

匿名结构体

结构体的自引用

结构体变量的初始化

访问结构体成员的方式

结构体的内存对齐

如何设计结构体

位段

枚举体

1. 基本语法

2. 定义和使用示例

2.1 简单枚举

2.2 指定枚举值

3. 枚举变量定义方式

枚举 vs 宏定义

共用体

共用体的定义

共用体大小的计算


结构体

结构体是什么?

结构是一些值的集合 , 这些值称为成员变量。结构的每个成员可以是不同类型的变量。

数组也是一些值的集合,但这些值的类型是相同的。

结构体的定义

struct 结构体名
{
	成员表列;
}变量表列;

定义结构体的例子:

struct Stu
{
	int age;
	char name[20];
}s1,s2;

定义了一种结构体叫 Stu ,它有两个成员:age 和 name ,类型分别是 int 和 char [20],随后定义了两个结构体变量 s1 和 s2。

如果结构体定义在 main 函数之前,那么 s1 和 s2 就是全局变量。结构体也可以在 main 函数内部定义。

定义结构体变量可以在定义结构体时就定义,如 s1 和 s2,也可以在 mian 函数内定义:

struct Stu
	{
		int age;
		char name[20];
	}s1,s2;
int main()
{
	struct Stu s3, s4;
	return 0;
}

typedef

如果每次定义结构体变量的时候不想写 struct ,可以在定义结构体变量时写上一个 typedef,如:

typedef struct student

{...}Stu;

下次定义结构体变量时,就只需要写 Stu s1;而不需要写 struct student s1;

typedef 也可以在定义结构体之后再使用:

struct student

{...};

typedef struct student stu;

 分析以下代码:

typedef struct Node
{
	int data;
	Node* next;
}Node;

 代码的原意是将结构体 struct Node 命名为 Node ,在定义结构体时就直接用 Node 来定义 next 指针,但这种做法是不合法的。

匿名结构体

匿名结构体就是在定义结构体时,不指定结构体的名字:

struct 
	{
		int age;
		char name[20];
	}s1,s2;

这种结构体只有在定义结构体后就定义结构体变量,而不能在其他地方定义结构体变量。

分析以下代码:

struct 
	{
		int age;
		char name[20];
	}s1;
struct
	{
		int age;
		char name[20];
	}*p;
int main()
{
	p = &s1;
	return 0;
}

s1 和 p 的结构是一样的,但 p = &s1 ;是不合法的。

结构体的自引用

在结构中包含一个类型为该结构本身的成员是否可以呢?

struct Node
	{
		int data;
		struct Node next;
	};

 这是不行的,因为这种结构体类型的大小是无穷大的,但是我们可以把 struct Node next 改为 

struct Node * next;这样这种结构体类型的大小就是 8 或 12 了,并且这种结构体就叫作链表。

链表

struct Node
	{
		int data;
		struct Node *next;
	};

结构体变量的初始化

示例:

struct Stu
	{
		int age;
		char name[20];
	}s1 = { 21,"zhangsan" };

struct Stu s2 = { 12,"wangwu" };
int main()
{
	struct Stu s3 = { 18,"lisi" };
	return 0;
}

即按照定义结构体时成员变量的顺序,将要初始化的内容用大括号括起来,并且用逗号隔开。

如果结构体内定义有结构体,则初始化这种结构体时对结构体内的成员结构体初始化要加大括号:

struct A
	{
		int a;
		char arr1[20];
	};

struct B
	{
		int b;
		struct A a1;
		char arr2[20];
	};

struct B b1 = { 12,{30,"hehe"},"haha" };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值