C语言:结构体详解

目录

一、结构体的声明

1.1结构体的声明

1.2结构体的特殊声明

1.2.1未定义变量的声明

1.2.2未定义标签的声明 

二、结构体的初始化

2.1按照结构体成员顺序初始化

2.2按照指定顺序初始化 

三、结构体的自引用

四、结构体的内存对齐


一、结构体的声明

1.1结构体的声明

结构体(struct)是 C 语言中一种用户自定义的数据类型,它允许用户将不同类型的数据组合在一起,形成一个新的数据类型。结构体可以包含多个成员变量,每个成员变量可以是不同类型的数据,例如整数、浮点数、字符、数组、指针等。

在 C 语言中,定义结构体的语法如下:

struct 结构体名称 
{
    成员变量声明;
};

其中,结构体名称是结构体的名称,成员变量声明是结构体中包含的成员变量的声明。成员变量的声明类似于变量的声明,但是需要在变量名前面加上结构体名称和一个点号(.)。

例如,下面是一个简单的结构体定义:

struct student 
{
    int age;
    char name[20];
    float marks;
};

 在这个例子中,我们定义了一个名为 student 的结构体,它包含三个成员变量:age(表示学生的年龄)、name(表示学生的姓名,是一个长度为 20 的字符数组)和 marks(表示学生的成绩)。

1.2结构体的特殊声明

1.2.1未定义变量的声明

struct my_struct 
{
    int x;
    char y;
    float z;
};

上面的代码只声明了结构体的定义,但并没有定义结构体变量。 

1.2.2未定义标签的声明 

struct
{
 int a;
 char b;
 float c;
}a[20], *p;

上面的结构体在声明的时候省略掉了结构体标签 

二、结构体的初始化

2.1按照结构体成员顺序初始化

#include 
struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
};
int main()
{
 //按照结构体成员的顺序初始化
 struct Stu s = { "胡桃", 16, "女", "202300160715" };
 printf("name: %s\n", s.name);
 printf("age : %d\n", s.age);
 printf("sex : %s\n", s.sex);
 printf("id : %s\n", s.id);
 return 0; 
}

2.2按照指定顺序初始化 

#include 
struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
};
int main()
{
 //按照指定的顺序初始化
 struct Stu s2 = { .age = 500, .name = "纳西妲", .id = "202305001027", .sex = "⼥"}
 printf("name: %s\n", s2.name);
 printf("age : %d\n", s2.age);
 printf("sex : %s\n", s2.sex);
 printf("id : %s\n", s2.id);
 return 0; 
}

三、结构体的自引用

在 C 语言中,可以使用结构体的自引用来创建一个循环结构。例如,下面是一个简单的例子:

struct node 
{
    int data;
    struct node *next;
};

: 在结构体的自引用中一定不能使用结构体的特殊声明,否则结构体会重复声明,导致代码错误。

四、结构体的内存对齐

在 C 语言中,结构体的内存对齐是指在内存中为结构体分配空间时,按照一定的规则将结构体的成员变量按照某种方式排列,以使每个成员变量的地址都是对齐的。这样做的目的是为了提高程序的运行效率,减少内存访问的开销。一般来说,编译器会按照以下原则进行内存对齐:

  1. 结构体的每个成员都按照其类型的大小进行对齐。
  2. 结构体的总大小必须是其最宽成员大小的整数倍。
  3. 结构体的总体大小为最大对齐数(结构体中所以对齐数中最大的一个)的整数倍。
  4. 如果嵌套了结构体的情况,结构体中成员对齐到所有成员中最大对齐数的整数倍处,结构体的整体大小计算所有最大对齐数的整数倍。

举个例子,假设我们定义了一个如下的结构体:

struct my_struct 
{
    int x;
    char y;
    short z;
};

在 x86 平台上,该结构体的内存对齐方式如下:

  • 结构体的总大小为 8 字节(因为 int 和 short 都是 4 字节对齐,而 char 是 1 字节对齐)。
  • 成员变量 x 的大小为 4 字节,因此它的地址是 4 字节对齐的。
  • 成员变量 y 的大小为 1 字节,因此它的地址是 1 字节对齐的。
  • 成员变量 z 的大小为 2 字节,因此它的地址必须是对齐结构体大小的最小值,即 8 字节对齐的。

因此,在内存中,该结构体的排列方式如下:

C语言:结构体详解_第1张图片

因为y是1个字节,z是2个字节在内存对齐中第6个字节被浪费了。 

C语言:结构体详解_第2张图片

你可能感兴趣的:(C语言知识,c语言,开发语言)