C语言中对自定义类型(结构体、枚举、联合)的深度剖析

本文深入剖析C语言中的自定义类型,包括结构体的概念与声明、内存对齐规则、位段的内存分配、枚举的优缺点以及联合的特性。通过实例解析结构体的自引用、结构体传参、位段的跨平台问题以及联合大小的计算。
摘要由CSDN通过智能技术生成



常见的自定义类型(构造类型)都有:结构体、枚举、联合体,接下来我们一个一个来看,首先,我们先看结构体:

一、结构体

1.1结构的概念

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

1.2结构的声明

下来我们用一个例子来看看结构的声明:

struct People //struct为结构体关键字,People为结构体标签名
{
   
	char name[20]; //大括号里面是结构体的成员列表
	char tel[20];
	int age;
};  //注意:这里的分号不能省略

也可以用这种方式声明:

struct People //struct为结构体关键字,People为结构体标签名
{
   
	char name[20]; //大括号里面是结构体的成员列表
	char tel[20];
	int age;
}p1,p2;  //这里的p1,p2为变量列表(变量列表可以省略)

1.3 特殊的声明

即在声明结构的时候,可以不完全的声明。如下面的匿名结构体类型:它没有结构体标签名,只有变量列表。

//匿名结构体类型
struct
{
   
    int a;
    char b;
    float c;
}x;
//匿名结构体类型
struct
{
   
    int a;
    char b;
    float c;
}x;
struct
{
   
    int a;
    char b;
    float c;
}*p;//这里为一个匿名结构体指针
int main()
{
   
	p = &x; //等号两边的类型不兼容
	return 0;
}

编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。
以上代码表明匿名结构体类型只能用一次,以后不能再继续使用。成员列表一样也会被认为是两种不同的类型。

1.4 结构的自引用

即自己类型的对象找到同类型的另外一个对象,就存储另外一个对象的地址。

struct Node
{
   
	int data;//数据域
	struct Node* next;//指针域
}

结构体的自引用不能省略结构体标签名。例:

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

1.5 结构体变量的定义和初始化

结构体变量的3种创建方法:p1,p2,p3,其中p1,p2属于全局变量,p3属于局部变量。

struct Point
{
   
	int x;
	int y;
}p1; //声明类型的同时定义变量p1
	struct Point p2; //定义结构体变量p2
	int main()
{
   
	struct Point p3;
	return 0;
}

结构体也可以在变量创建的同时进行初始化,如上面的代码就可以写成:
【注意】:结构体的初始化要用大括号{}

struct Point
{
   
	int x;
	int y;
}p1 = {
   1,2}; //声明类型的同时定义变量p1
	struct Point p2 = {
   3,4}; //定义结构体变量p2
	int main()
{
   
	struct Point p3 = {
   5,6};
	return 0;
}

在这里插入图片描述
通过对上面代码的调试,我们可以清楚看到初始化情况。

  • 如果是结构体里面包含结构体的情况又是怎么初始化的呢?我们一起来看一下下面的代码:结构体S里面包含结构体Point
struct Point
{
   
	int x;
	int y;
}p1 = {
    1, 2 }; //声明类型的同时定义变量p1
struct Point p2 = {
    3, 4 }; //定义结构体变量p2
struct S
{
   
	double d;
	struct Point p;
	char name[20];</
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值