C语言联合体类型的实现

 更新时间:2024年02月06日 11:34:12   作者:愚润求学  
联合体也是一种构造数据类型,和结构体类型一样,它也是由各种不同类型的数据组成,本文主要介绍了C语言联合体类型的实现,具有一定的参考价值,感兴趣的可以了解一下

一,什么是联合体

联合体也称共用体
像结构体一样,联合体也是由一个或者多个成员构成,这些成员的类型可以不同。但是,与结构体不同的是:联合体的所有成员共用一块内存空间。(即:给联合体其中的一个成员赋值,其他成员的值也会跟着被改变)

二,联合体的声明

1,联合体类型的声明

C语言中联合体类型的定义形式:

union 联合体名
{
成员项表列
};

例如:
(我们定义一个同时由char和int型构成的联合体)

union Un
{
   char c;
   int i;
}; (注意:分号不能丢)

2,联合体变量的创建

同结构体变量的创建类似,我们可以在声明联合体类型的同时创建变量;也可以在声明后,再创建变量
如:
(1)先声明联合体类型,再创建变量

#include<stdio.h>
union Un
{
	char c;
	int i;
};
union Un u1;

(2)在声明联合体类型的同时创建变量

union Un
{
	char c;
	int i;
}u1;

对联合体成员的引用也与对结构体成员的引用相同

三,联合体的特点

1,联合体与结构体的对比

联合体的大部分与结构体相似,其独特之处就是所有成员共用一块内存空间

例如,我们看拥有相同成员的结构体和联合体对比:

在这里插入图片描述

对于s1 和 u1的内存分配情况应该是:

在这里插入图片描述

我们可以用sizeof算一算,看看结果:
运行下面代码:

int main()
{
	printf("%d\n", sizeof(s1));
	printf("%d\n", sizeof(u1));
	return 0;
}

输出:

这里是引用

可以发现:和我们上面的分析一样

2,对联合体成员进行改变

下面我们就对联合体u1中的成员c进行赋值,然后再打印成员i

#include<stdio.h>
union Un
{
	char c;
	int i;
}u1;
int main()
{
	u1.c = 1;
	printf("%d", u1.i);
	return 0;
}

运行结果:

在这里插入图片描述

可见:尽管没有给成员i赋值,但是随着成员c被修改成员i的值也发生了变化

四,联合体的大小

上面提到的联合体u1的大小是4,刚好是当中最大的int类型的大小,难道联合体的大小就是其中最大成员的大小吗?
答案是:错误的
因为联合体的大小也要满足是最大对齐数的整数倍

⭐换句话来说,联合体的大小要满足以下两个条件:
1,大于或等于最大的成员(至少要能装下最大的成员)
2,同时是最大对齐数的整数倍

对于上面的u1
最大成员:int类型的大小是4
int的最大对齐数也是4,所以联合体u1的大小是4

再看下面的代码(多加一个字符数组):

#include<stdio.h>
union Un
{
	char c;
	int i;
	char arr[6];
}u1;
int main()
{
	u1.c = 1;
	printf("%d",sizeof(u1));
	return 0;
}

运行结果:

在这里插入图片描述

这是因为:
1,最大成员char arr[6]的大小是6
2,最大对齐数是4
6不是4的倍数,所以扩宽到8,所以联合体的大小是8

到此这篇关于C语言联合体类型的实现的文章就介绍到这了,更多相关C语言联合体类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Opencv学习教程之漫水填充算法实例详解

    Opencv学习教程之漫水填充算法实例详解

    这篇文章主要给大家介绍了Opencv学习教程之漫水填充算法的相关资料,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • 解析c++中的默认operator=操作的详解

    解析c++中的默认operator=操作的详解

    本篇文章是对c++中的默认operator=操作的应用进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C++ 手把手教你实现可变长的数组实现

    C++ 手把手教你实现可变长的数组实现

    这篇文章主要介绍了C++ 手把手教你实现可变长的数组实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C++机房预约系统实现流程实例

    C++机房预约系统实现流程实例

    这篇文章主要介绍了C++机房预约系统实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • 基于WTL 双缓冲(double buffer)绘图的分析详解

    基于WTL 双缓冲(double buffer)绘图的分析详解

    本篇文章是对WTL下使用双缓冲(double buffer)绘图进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • gdb调试命令的使用及总结

    gdb调试命令的使用及总结

    gdb是一个在UNIX环境下的命令行调试工具。如果需要使用gdb调试程序,请在gcc时加上-g选项。下面的命令部分是简化版,比如使用l代替list等等
    2013-05-05
  • C++学习小结之二进制转换

    C++学习小结之二进制转换

    这篇文章主要介绍了C++学习小结之二进制转换的相关资料,需要的朋友可以参考下
    2015-07-07
  • C++ STL实现非变易查找算法的示例代码

    C++ STL实现非变易查找算法的示例代码

    C++ STL 中的非变易算法(Non-modifying Algorithms)是指那些不会修改容器内容的算法,是C++提供的一组模板函数,下面我们就来看看这一算法的应用吧
    2023-08-08
  • C语言冒泡排序法的实现(升序排序法)

    C语言冒泡排序法的实现(升序排序法)

    这篇文章主要介绍了C语言冒泡排序法的实现(升序排序法),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • VC判断一个文件为目录的方法

    VC判断一个文件为目录的方法

    这篇文章主要介绍了VC判断一个文件为目录的方法,在Windows应用程序设计中非常具有实用价值,需要的朋友可以参考下
    2014-10-10

最新评论