结构体、枚举类型、共同体的定义与使用

目录

一、结构体

二、枚举类型 

三、共同体 (联合体)

一、联合体的声明:

二、联合体的定义:

 三、联合体的特点:

 四、计算联合体的大小:


一、结构体

如何定义结构体变量及进行初始化?

struct Point
{
 int x;
 int y;
}p1; //声明类型的同时定义变量p1

struct Point p2; //定义结构体变量p2

//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};


struct Stu        //类型声明
{
 char name[15];//名字
 int age;      //年龄
};

struct Stu s = {"zhangsan", 20};//初始化


struct Node
{
 int data;
 struct Point p;
 struct Node* next; 
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化

struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化


//结构体的自引用
struct Node
{
 int data;
 struct Node* next;
};

二、枚举类型 

枚举类型的定义:

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};

enum Color//颜色
{
 RED,
 GREEN,
 BLUE
};
以上定义的 enum Day enum Sex enum Color 都是枚举类型。
{ }中的内容是枚举类型的可能取值,也叫 枚举常量
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
例如:
enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE=4
};

枚举类型的使用:

例1:

enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;

这段代码定义了一个枚举类型 Color,其中列出了三种颜色:REDGREEN 和 BLUE。每个颜色都有一个对应的整数值。

在代码的最后,我们使用 enum Color clr = GREEN; 将枚举常量 GREEN 赋值给变量 clr,这样变量 clr 就表示了绿色。

例2:

我们可以使用枚举类型作为case后的常量,这样我们更好判断每个case后实现的是什么函数功能。

#include"contact.h"

void meau()
{
	printf("*******************************\n");
	printf("***** 1、add    2、delete *****\n");
	printf("***** 3、find   4、change *****\n");
	printf("***** 5、show   6、clean  *****\n");
	printf("***** 7、sort   0、exit   *****\n");
	printf("*******************************\n");
}

enum op
{
	Exit,
	add,
	delete,
	find,
	change,
	show,
	clean,
	sort
};

int main()
{
	contact newbook;
	init_book(&newbook);
	int input;
	do
	{
		meau();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			add_book(&newbook);
			break;
		case delete:
			delete_book(&newbook);
			break;
		case find:
			find_by_name(&newbook);
			break;
		case change:
			change_information(&newbook);
			show_book(&newbook);
			break;
		case show:
			show_book(&newbook);
			break;
		case clean:
			clean_book(&newbook);
			break;
		case sort:
			sort_by_name(&newbook);
			show_book(&newbook);
			break;
		case Exit:
			printf("程序退出!!!\n");
			break;
		default:
			printf("请重新选择>:\n");
			break;
		}
	} while (input);
}

三、共同体 (联合体)

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

一、联合体的声明:

union Un
{
 char c;
 int i;
};

二、联合体的定义:

union Un un;

 三、联合体的特点:

联合的成员是共用同一块内存空间的
union Un
{
 int i;
 char c;
};
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));

 四、计算联合体的大小:

printf("%d\n", sizeof(un));

原则:

1、联合的大小至少是最大成员的大小。
2、当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

详细过程:

例:

union Un1
{
 char c[5];  //  对齐数为 1
 int i;      //  对齐数为 4
};
union Un2
{
 short c[7]; //  对齐数为 2
 int i;      //  对齐数为 4
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));

由于联合体中变量共用一块空间且联合体的大小至少是最大成员的大小,所以Un1大小至少为5。又因为Un1中最大对齐数为4,所以Un1的大小为8.

同理Un2大小至少为14,有因为Un2中最大对齐数为4,所以Un2大小为16.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这题怎么做?!?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值