【2022/3/18】自定义数据类型

本文详细介绍了C语言中的结构体、共用体和枚举类型,包括它们的声明、使用、内存分配以及在实际编程中的应用。结构体允许组合不同类型的数据,共用体则允许多个成员共享同一块内存,枚举类型提供了一种限制整型变量取值范围的方式。通过示例代码,展示了这些概念如何在实际编程中操作和交互。
摘要由CSDN通过智能技术生成

结构体

#include <stdio.h>
#include <stdlib.h>
#include <string.h> //字符串处理函数头文件 

//结构体struct:自定义数据类型中的一种,能够满足不同用户需要存储的不同信息

//结构体类型的声名
struct people{ //人类结构体类型
	//结构体成员
	int id; //编号
	char name[20]; //姓名
	char gender[4]; //性别
	int age; //年龄
}P2, P3 = {3,"赵欣扬","男"}; //结构体声名时定义变量,并初始化赋值
/*
struct:结构体关键字
struct people:结构体类型的类型名,是个数据类型
id、name、gender、age:结构体成员
P1、P2、P3:结构体变量
*/

int main()
{
	int a = 10;
	int arr[10];
	//arr = { 1, 2, 3, 4, 5, 6 };
	//结构体声名后定义变量
	struct people P1; //结构体变量的定义

	//结构体成员引用符:'.'
	//引用结构体成员的基本格式:结构体变量名.结构体成员名
	P1.id = 1;
	//P1.name = "大师兄";
	strcpy(P1.name, "大师兄"); //字符串拷贝函数
	strcpy(P1.gender, "男");
	P1.age = 18;

	printf("id:%d\nname:%s\ngender:%s\nage:%d\n", P1.id, P1.name, P1.gender, P1.age);

	//struct people P2; //结构体变量的定义
	scanf("%d %s %s %d", &P2.id, P2.name, P2.gender, &P2.age);
	printf("id:%d\nname:%s\ngender:%s\nage:%d\n", P2.id, P2.name, P2.gender, P2.age);

	struct people P4 = P1; //结构体变量之间可以相互赋值

	P3.age = P2.age; //结构体成员之间也可以相互赋值

	P3.age = P1.id;

	system("pause");
	return 0;
}

结构体的嵌套

#include <stdio.h>
#include <stdlib.h>

//结构体的嵌套:一个结构体类型中又可以有其他结构体类型的成员

struct test{
	int a;
	double b;
	char c;
};

struct people{ //人类结构体类型
	//结构体成员
	int id; //编号
	char name[20]; //姓名
	char gender[4]; //性别
	int age; //年龄
	struct test t1; //结构体的成员又是其他结构体类型的变量
	//struct people p; //一个结构体类型中可以有本身结构体类型的成员吗?不行
};

//一个结构体类型中可以有本身结构体类型的成员吗?
	//不行,因为结构体类型没有定义完整

//函数为什么可以嵌套调用:因为有函数声名的存在

int main()
{
	struct people P1;
	P1.id;
	P1.age;
	P1.t1;
	P1.t1.a = 1; //结构体的成员又是其他结构体类型的变量中成员的引用
	P1.t1.b = 1.23;

	system("pause");
	return 0;
}

结构体数组

#include <stdio.h>
#include <stdlib.h>

//结构体数组:结构体类型的数组
struct people{ //人类结构体类型
	//结构体成员
	int id; //编号 4
	char name[20]; //姓名 20
	char gender[4]; //性别 4
	int age; //年龄 4
};

struct test{
	int a; //4
	float b; //4
	double d; //8
	char c; //1
	//17内存补齐为24,正好整数个存储最大成员类型double
};

int main()
{
	struct people P1;
	struct people P[10]; //结构体数组

	P[0].id = 0; //结构体数组元素及元素中成员的引用
	P[1].age = 10;

	//结构体类型所占内存大小:一般来说是所有成员内存大小之和
	printf("%d\n", sizeof(struct people)); //32

	printf("%d\n", sizeof(struct test)); //17 ? //24
	
	//结构体的内存大小存在内存对齐:
		//整体内存大小需要能够整数个存储最大成员大小,不足的补上大小

	//结构体数组内存大小:结构体类型大小*数组元素个数

	system("pause");
	return 0;
}

typedef的使用

#include <stdio.h>
#include <stdlib.h>

//typedef:用于给数据类型取别名
	//基本格式:typedef 类型名 类型别名;

typedef int I;
//类似于#define I int;
//但是typedef除了给数据类型取别名以外,没有其他功能
//而宏定义是在编译之前做的事情,还有带参宏

//typedef printf 输出; //printf不是数据类型,typedef只能用于给数据类型取别名

typedef struct people{ //人类结构体类型
	//结构体成员
	int id; //编号
	char name[20]; //姓名
	char gender[4]; //性别
	int age; //年龄
}P,P1,P2; //P、P1、P2不是变量名,而是类型别名

//typedef struct people P;
//#define P struct people;

//感觉typedef没有#define的功能那么强大
//但是某些数据类型的别名必须使用typedef定义,而不能使用#define
//比如给数组类型取别名:
typedef int arr[10]; //arr为int [10] 这种数组类型的别名
//#define int arr[10] //#define不支持这种格式

int main()
{
	int a;
	I b; //int b;

	P P3;
	P1 P4;
	P2 Pn;

	arr a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

	system("pause");
	return 0;
}

共用体

#include <stdio.h>
#include <stdlib.h>

//共用体union:成员内存共享的结构体
union test{
	int a; //4
	float b; //4
	double d; //8
	char c; //1
};

union test1{
	int a; //4
	int b; //4
};

union test2{
	int a; //4
	double b; //8
	char c; //1
};

int main()
{
	//共用体和结构体的使用方式类似
	//union test t1;
	//t1.a = 1;
	//t1.b = 1.23;
	//t1.c = 'a';
	//t1.d = 123.456;
	//printf("%d\n%f\n%c\n%lf", t1.a, t1.b, t1.c, t1.d);

	union test1 t2;
	t2.a = 1;
	t2.b = 2;
	printf("%d\t%d\n", t2.a, t2.b); //2 2
	//共用体的所有成员公用同一段内存

	//共用体类型的内存大小为:最大成员的内存大小
	printf("%d\n", sizeof(union test1)); //4

	printf("%d\n", sizeof(union test2)); //8

	//共用体类型内存也存在内存对齐的情况

	system("pause");
	return 0;
}


枚举类型

#include <stdio.h>
#include <stdlib.h>

//枚举类型enum:枚举就是穷举,将类型所有可能的取值一一列举出来,变量只能在列举的范围内取值
	//枚举类型的本质就是整型,以整型的逻辑参与运用和运算,相当于取值范围受限的整型

//枚举类型的声名
//enum Weekday{ sun, mon, tue, wed, thu, fri, sat }weekend; //枚举值默认从0开始
enum Weekday{ sun = 7, mon = 1, tue, wed, thu, fri, sat }weekend;
	//星期枚举类型:从星期日到星期六
/*
enum:枚举类型关键字
enum Weekday:枚举类型的类型名
sun, mon, tue, wed, thu, fri, sat:枚举元素(枚举成员、枚举常量),枚举值默认从0开始
weekend:枚举类型变量
*/

int main()
{
	//枚举变量的定义
	enum Weekday workday; //工作日
	workday = fri; //今天是星期五,工作日
	weekend = sun; //后天是星期天,周末休息日

	//枚举类型的本质就是整型,以整型的逻辑参与运用和运算
	printf("workday=%d\nweekend=%d\n", workday, weekend); //5 0
		//以%d的格式输出枚举变量的值
	//以%d的格式输出枚举成员的值
	printf("%d\n%d\n", mon, sat); //可以直接使用枚举成员

	//sun = 7; //枚举元素(枚举成员、枚举常量)是个常量,常量的值无法被改变
		//想要自定义枚举常量的值或者改变枚举常量的值,必须在类型声名时给定

	//如果指定了部分枚举元素的枚举值,其之后没有指定枚举值的枚举元素默认在上一个枚举值的基础上+1

	workday = 7; //7 == sun

	if (workday == sun) //枚举类型可以用于作为比较条件
	{
		printf("休息,休息一下!\n");
	}
	else
	{
		printf("工作ing!\n");
	}

	workday = 123; //可以给枚举变量赋值范围以外的值,但是没有意义
	printf("%d\n", workday);
	workday = 'a'; //字符类型当作整型处理,以ASCII码值为参考

	system("pause");
	return 0;
}

枚举类型的应用举例

#include <stdio.h>
#include <stdlib.h>

//枚举类型的应用举例
enum dir{= 'w',= 's',= 'a',= 'd' }; //方向枚举类型
	//以字符的ASCII码给枚举元素赋初值

//游戏状态枚举
enum game{ 开始, 暂停, 结束, 退出 };

int main()
{
	while (1)
	{
		switch (getchar())
		{
		case:
			puts("向上!\n");
			break;
		case:
			puts("向下!\n");
			break;
		case:
			puts("向左!\n");
			break;
		case:
			puts("向右!\n");
			break;
		}
	}

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值