结构体和联合体的区别及说明

 更新时间:2025年01月07日 09:33:29   作者:嵌入式学习菌  
文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一段存储空间来存储不同类型的数据

结构体和联合体的区别

1. 结构体(Struct)

在 C 语言中,结构体是一种自定义的复合数据类型,允许将不同数据类型的变量组合成一个单一的实体。结构体可以包含多个成员,每个成员可以是不同的数据类型,如整数、浮点数、字符、数组等。

结构体的定义通常在函数外部,并且在函数内部可以声明和使用结构体类型的变量。结构体的定义包含了结构体的名称和结构体成员的列表,每个成员都有一个名称和一个数据类型。结构体的成员可以通过成员运算符(.)来访问。

以下是一个简单的 C语言 结构体的示例:

#include <stdio.h>

// 定义一个名为Student的结构体
struct Student {
int roll_no; // 学号
char name[50]; // 姓名
int age; // 年龄
float score; // 分数
};

int main() {
// 声明并初始化一个Student类型的结构体变量
struct Student student1 = {101, "Alice", 20, 95.5};

// 访问结构体成员并输出
printf("Roll No: %d\n", student1.roll_no);
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("Score: %.2f\n", student1.score);

return 0;
}

2. 联合体(Union)

在 C 语言中,联合体是一种特殊的数据结构,可以在内存中共享同一段存储空间来存储不同类型的数据。与结构体类似,联合体也是一种用户自定义的数据类型,可以包含多个不同类型的成员变量。

联合体的定义使用关键字‘union’,后面紧跟联合体的名称和一对花括号,括号中定义了联合体的成员变量,每个成员变量有自己的名称和数据类型。

#include <stdio.h>

// 定义一个联合体
union Data {
int i;
float f;
char c;
};

int main() {
union Data data; // 声明一个联合体变量data

data.i = 42; // 给联合体的整数成员赋值
printf("data.i = %d\n", data.i); // 输出整数成员的值

data.f = 3.14; // 给联合体的浮点数成员赋值
printf("data.f = %.2f\n", data.f); // 输出浮点数成员的值

data.c = 'A'; // 给联合体的字符成员赋值
printf("data.c = %c\n", data.c); // 输出字符成员的值

// 注意:联合体的不同成员共享同一块内存空间,赋值一个成员会影响其他成员的值
printf("data.i = %d, data.f = %.2f, data.c = %c\n", data.i,data.f, data.c);
//data.i = 1078523201, data.f = 3.14, data.c = A

return 0;
}

3. 联合体与结构体的区别

结构体联合体
关键字structunion
成员多个成员多个成员
存放每个成员都有自己的内存空间所有成员共用同一块内存空间

4. 实例分析

  • 定义联合体

  • main.c

调试过程中,可以看到各个变量:

这说明联合体所有成员都存储在同一个空间中,每个成员不可能同时使用。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈C#中的值类型和引用类型

    浅谈C#中的值类型和引用类型

    在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。下面我们来简单谈谈C#中的值类型和引用类型
    2016-06-06
  • C#实现文件上传下载Excel文档示例代码

    C#实现文件上传下载Excel文档示例代码

    这篇文章主要介绍了C#实现文件上传下载Excel文档示例代码,需要的朋友可以参考下
    2017-08-08
  • 关于C#连接FTP时路径问题的解决方法

    关于C#连接FTP时路径问题的解决方法

    最近在工作中遇到一个需求,需要利用C#连接FTP,在连接过程中遇到一个问题,所以下面这篇文章主要给大家介绍了关于C#连接FTP时路径问题的解决方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • C#中免费密码库BouncyCastle的使用详解

    C#中免费密码库BouncyCastle的使用详解

    这篇文章主要来和大家分享一个C#版开源、免费的Bouncy Castle密码库:BouncyCastle,文中介绍了BouncyCastle的具体使用,需要的可以参考下
    2024-03-03
  • C#实现根据数字序号输出星期几的简单实例

    C#实现根据数字序号输出星期几的简单实例

    这篇文章主要介绍了C#实现根据数字序号输出星期几的简单实例,代码简洁实用,也有助于初学者更好的理解C#的switch和if语句的流程控制,需要的朋友可以参考下
    2014-07-07
  • C#编程之事务用法

    C#编程之事务用法

    这篇文章主要介绍了C#编程之事务用法,结合实例形式对比分析了C#中事务提交与回滚的具体实现技巧与相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 详解c# 数组(Array)

    详解c# 数组(Array)

    这篇文章主要介绍了c# 数组的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C# 动画窗体(AnimateWindow)的小例子

    C# 动画窗体(AnimateWindow)的小例子

    C# 动画窗体(AnimateWindow)的小例子,需要的朋友可以参考一下
    2013-03-03
  • C# 标准事件流实例代码

    C# 标准事件流实例代码

    这篇文章主要介绍了C# 标准事件流的实例代码,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • c#中Linq to Sql 增删除的实例

    c#中Linq to Sql 增删除的实例

    c#中Linq to Sql 增删除的实例,需要的朋友可以参考一下
    2013-05-05

最新评论