本节重点讲述结构体(struct)和联合体(union)的概念及使用,如果想详细了解关键字的同学点击下方链接进行跳转
1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客
1-3 C语言 - 控制语句的使用注意事项(这些绝对是您经常出错的地方)-CSDN博客
1-4 C语言 - 存储类别关键字及其使用(超详细)-CSDN博客
1-5 C语言 - 类型修饰符关键字const和volatile的概念及使用(超详细)-CSDN博客
目录
在C语言中,struct
(结构体)和union
(联合体)是两种用于定义自定义数据类型的关键字。它们允许将不同类型的数据组合在一起,以便在程序中更方便地使用和管理。
结构体(struct)
概念: 结构体是一种聚合数据类型,可以将多个不同类型的变量组合在一起。每个变量在结构体中称为成员。结构体成员在内存中是按顺序存储的,并且每个成员都有自己的内存空间。
定义和使用:
-
定义结构体类型:
struct Person { char name[50]; int age; float height; };
-
声明结构体变量:
struct Person person1; struct Person person2 = {"Alice", 30, 5.5};
-
访问结构体成员:
person1.age = 25; strcpy(person1.name, "JiaoY"); person1.height = 6.0; printf("Name: %s\n", person1.name); printf("Age: %d\n", person1.age); printf("Height: %.1f\n", person1.height);
-
通过指针访问结构体成员:
struct Person *ptr = &person1; ptr->age = 26; printf("Age: %d\n", ptr->age);
内存布局: 在结构体中,每个成员都有自己的存储空间,成员按其声明的顺序在内存中依次存储。这可能会导致内存对齐和填充问题,影响内存利用率。
联合体(union)
概念: 联合体是一种数据结构,允许将不同类型的数据存储在同一内存位置。也就是说,联合体的所有成员共享同一块内存,任何时候只能存储一个成员的值。
定义和使用:
-
定义联合体类型:
union Data { int i; float f; char str[20]; };
-
声明联合体变量:
union Data data;
-
访问联合体成员:
data.i = 10; printf("data.i: %d\n", data.i); data.f = 220.5; printf("data.f: %.1f\n", data.f); strcpy(data.str, "C Programming"); printf("data.str: %s\n", data.str);
内存布局: 联合体的大小由其最大成员决定,因为所有成员共用同一块内存空间。当一个成员被赋值时,其他成员的值会被覆盖。
注意事项:
- 使用联合体时,必须确保只在适当的成员上执行适当的操作,否则可能会导致数据混乱。
- 联合体常用于节省内存的情况,例如在实现多态数据结构时(如一个节点可能包含不同类型的数据)。
结构体与联合体的比较
-
内存使用:
- 结构体:每个成员都有自己的内存空间,结构体的总大小是所有成员大小的总和。
- 联合体:所有成员共享同一块内存,联合体的大小是其最大成员的大小。
-
成员访问:
- 结构体:可以同时访问所有成员。
- 联合体:任一时刻只能访问一个成员。
-
用途:
- 结构体:适用于需要组合多个不同类型数据的情况。
- 联合体:适用于需要在不同类型数据之间共享内存的情况。
示例代码
结构体示例
#include <stdio.h>
#include <string.h>
// 定义结构体类型Person
struct Person {
char name[50]; // 姓名,字符数组
int age; // 年龄,整数
float height; // 身高,浮点数
};
int main() {
struct Person person1; // 声明结构体变量person1
// 赋值给person1的成员
strcpy(person1.name, "jiaoy"); // 设置姓名为jiaoy
person1.age = 30; // 设置年龄为30
person1.height = 5.5; // 设置身高为5.5
// 输出结构体成员的值
printf("Name: %s\n", person1.name); // 输出姓名
printf("Age: %d\n", person1.age); // 输出年龄
printf("Height: %.1f\n", person1.height); // 输出身高
return 0; // 程序结束
}
- 结构体
Person
包含三个成员:name
(字符数组)、age
(整数)和height
(浮点数)。 - 在
main
函数中,声明了一个结构体变量person1
。 - 使用
strcpy
函数将字符串"jiaoy"复制到person1
的name
成员。 - 将整数30赋值给
person1
的age
成员。 - 将浮点数5.5赋值给
person1
的height
成员。 - 最后,通过
printf
函数输出person1
的成员值。
联合体示例
#include <stdio.h>
#include <string.h>
// 定义联合体类型Data
union Data {
int i; // 整数类型
float f; // 浮点数类型
char str[20]; // 字符数组类型
};
int main() {
union Data data; // 声明联合体变量data
data.i = 10; // 给联合体成员i赋值
printf("data.i: %d\n", data.i); // 输出整数成员i的值
data.f = 220.5; // 给联合体成员f赋值
printf("data.f: %.1f\n", data.f); // 输出浮点数成员f的值
strcpy(data.str, "C Programming"); // 给联合体成员str赋值
printf("data.str: %s\n", data.str); // 输出字符数组成员str的值
return 0; // 程序结束
}
- 联合体
Data
包含三个成员:i
(整数)、f
(浮点数)和str
(字符数组)。 - 在
main
函数中,声明了一个联合体变量data
。 - 依次给
data
的i
、f
和str
成员赋值,并使用printf
函数输出每个成员的值。 - 由于联合体的所有成员共享同一块内存,因此每次赋值后,之前的值会被覆盖。