0
点赞
收藏
分享

微信扫一扫

【C语言】自定义类型全家桶(值得收藏)

王老师说 2022-01-31 阅读 79

目录

🍈🍈👀前言

🍈🍈结构体类型

🍈🍈结构体的声明

🍈🍈结构体变量的定义与初始化

🍈🍈结构体的自引用

🍈🍈结构体的访问

🍈🍈结构体的传参

 🍈🍈传结构体

🍈🍈传地址

🍈🍈结构体的内存对齐

🍈🍈位段

🍈🍈位段的声明

🍈🍈位段的内存管理

🍈🍈位段的跨平台性

🍈🍈 枚举类型

🍈🍈枚举类型的定义

🍈🍈枚举类型赋予初始值

🍈🍈枚举类型的优点

🍈🍈联合体类型

🍈🍈联合体的定义

🍈🍈联合体的特点

 联合体内存大小的计算


📢结构体类型

struct tag         //这里的struct是结构体的关键字,tag是结构体标签,也就是结构体的名称
{
	number - list; //结构体成员列表
}veriable-list;    //结构体的变量 

📢结构体的声明

如果结构体的标签是student,我拿student来举例子

结构体的完整声明

struct Student
{
    char name[20];//姓名
    char sex;//性别
    int age;//年龄
    int num;//学号
};   //这里的分号不能丢

结构体的不完全声明(匿名结构体类型)

struct
{
	int a;
	char b;
	double c;
}s;   //这s不能省略

📢结构体变量的定义与初始化

结构体的定义大致分为三种情况

📢注意:结构体初始化与数组相同,都必须整体进行赋值。

📢结构体的自引用

struct Node //初始话链表
{
	int a;
	struct Node next;
};
struct Node //初始话链表
{
	int a;
	struct Node* next;
};

故就可以通过指针来访问每一个结点

📢结构体的访问

(1)通过结构体变量进行访问:

printf("%s\n",s.name);

(2)通过结构体指针进行访问:

printf("%s\n",ps->name);

📢结构体的传参

📢结构体的内存对齐(强烈建议观看)

在另外一篇文章详细讲过——【C语言系列】-结构体中的内存对齐

📢位段

可能有人没有听过什么是位段

位段的结构类型跟结构体有些类似可以类似结构体去学习

也可以说

位段是结构体特殊的实现

📢位段的声明

相较于结构体,位段的声明有两点不同

<1>规定位段的成员的必须是int,unsigned int ,signed int (但是写成char类型也没什么大的问题)

<2>位段的成员后面有一个冒号和一个数字

struct A  //位段的声明
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

📢位段的内存管理

#include<stdio.h>
struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};
int main()
{
	
	printf("大小是%d字节", sizeof(struct A));
	return 0;
}

📢位段的应用 

📢位段的跨平台性

 📢枚举类型

枚举类型适用于可以一一列举的类型

比如说星期、性别

📢枚举类型的定义

enum Day   //星期
{
	//枚举的可能取值
	Mon,
	Tues,
	Wed,
	Thir,
	Fri,
	Sta,
	Sun
};
enum Sex  //性别
{
	MALE,//0
	FEMALE,//1
	SECRET//2
};

枚举类型是有初始值的

如果你没赋予它初始值,就会默认从零开始,依次加一

📢枚举类型赋予初始值

#include<stdio.h>
enum Sex  //性别
{
	MALE = 4,
	FEMALE=10,
	SECRET//
};
main()
{
	printf("%d %d %d", MALE,FEMALE,SECRET);
	return 0;
}

可以看到,其实默认的值是可以改的

当某个成员被赋予某个值的时候,后续的成员就在此基础上加一

📢枚举类型的优点

📢联合体类型

📢联合体的定义

union Un  
{
	int a;
	char b;
};

union是联合体关键字,Un是联合体的标签

📢联合体的特点

共用体,顾名思义,这里的共用就是公用内存

内存的也可被折叠

#include<stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un u = {0};
	printf("%d\n", sizeof(u));
	printf("%p\n", &u);
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));
	return 0;
}

 他们有相同的地址

c和i存放在同一块内存空间上,修改c或者i都会影响到另一个成员。

 📢联合体内存大小的计算

 <1>联合体内存大小是最大成员的大小

<2>最大成员的大小如果不是最大对齐数的整数倍,就会对齐到最大对齐数的整数倍

(联合体也存在内存对齐)

#include<stdio.h>
union Un1
{
	char c[5];  
	int i;
};          
//Un1成员最大成员大小5,最大对齐数是4,所以Un1的大小是8;
union Un2
{
	char c[7];
		int i;
};
//Un2成员最大成员大小7,最大对齐数是4,所以Un2的大小是8;
int main()
{
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

  欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁 

举报

相关推荐

0 条评论