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

目录

  • 一、结构体
    • 1.1结构的概念
    • 1.2结构的声明
    • 1.3 特殊的声明
    • 1.4 结构的自引用
    • 1.5 结构体变量的定义和初始化
    • 1.6 结构体内存对齐
      • 例题一
      • 例题二
      • 例题三
    • 1.7 修改默认对齐数
    • 1.8 结构体传参
  • 二、位段
    • 2.1 什么是位段
    • 2.2 位段的内存分配
    • 2.3 位段的跨平台问题
  • 三、枚举
    • 3.1 枚举类型的定义
    • 3.2 枚举的优点
  • 四. 联合(共用体)
    • 4.1 联合类型的定义
    • 4.2 联合的特点
    • 4.3 联合大小的计算



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

一、结构体

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;
}

C语言中对自定义类型(结构体、枚举、联合)的深度剖析_第1张图片
通过对上面代码的调试,我们可以清楚看到初始化情况。

  • 如果是结构体里面包含结构体的情况又是怎么初始化的呢?我们一起来看一下下面的代码:结构体S里面包含结构体Point
struct Point
{
   
	int x;
	int y;
}p1 = {
    1

你可能感兴趣的:(C,编程,c语言,数据结构,visualstudio)