(C语言进阶)联合(共用体)

文章介绍了C语言中的联合类型(共用体)的概念,通过实例展示了联合体成员如何共享内存空间,强调了在同一时间只能使用一个成员的特点。同时,讨论了联合类型在判断计算机大小端存储方式的应用,并提及了联合体大小的计算,包括对齐规则的影响。最后,通过多个例题解释了联合体大小不是简单等于最大成员大小的原理。
摘要由CSDN通过智能技术生成

本节重点内容:

  • 联合类型的定义
  • 联合的特点
  • 联合大小的计算

联合类型的定义

联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

联合成员真的共用一块空间吗?我们上机实验一下!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
union Un
{
    char c;
    int i;
};
 
int main()
{ 
    union Un u;
    printf("%d\n", sizeof(u));
    printf("%p\n", &u);
    printf("%p\n", &(u.i));
    printf("%p\n", &(u.c));
    return 0;
}

输出结果:

分析: 

在内存中,i为int类型占4个字节,c为char类型占1个字节,联合体大小经过计算是4个字节,i和c的地址相同,那么i和c共用1个字节的空间。同时需要注意的是因为i和c共用空间,i发生改变c也发生改变,c发生改变i也发生改变,因此使用联合体时,在同一时间只能使用一个成员。

联合体,也叫共用体,共用体的成员共用一块空间,而且注意使用联合体时,在同一时间只能使用一个成员。

联合类型的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)

例题:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
union Un
{
    char c;
    int i;
};
int main()
{
    union Un un;
    // 下面输出的结果是一样的吗?
    printf("%p\n", &(un.i));
    printf("%p\n", &(un.c));
    //下面输出的结果是什么?
    un.i = 0x11223344;
    un.c = 0x55;
    printf("%x\n", un.i);
}

输出结果:

联合体特点的应用

根据联合体成员共用同一内存的特点,可以用来判断当前计算机的大小端存储的方式。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
union Un
{
    char c;
    int i;
};
 
int main()
{ 
    union Un u = { 0 };
    u.i = 1;
    if (u.c == 1)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }
    return 0;
}

输出结果:

分析:

 

还有一种方式是通过内存的存放位置来判断的,*(char*)&后判断是否等于1,等于1则为小端。

#include<stdio.h>
int main()
{
	int a = 1;
	if (*(char*)&a == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

联合体大小的计算

联合体也是存在对齐规则的。

  • 联合的大小至少最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

例题1 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
union Un
{
    char arr[5];  //5   对齐数为1
    int i;  //4  对齐数为4
};
 
int main()
{ 
    printf("%d\n", sizeof(union Un));
    return 0;
}

输出结果:

那也说明了联合体也是存在对齐的。

分析:

联合成员最大对齐数为4字节(最大对齐数是int,而且需要注意的是比较最大对齐数是看类型大小,不是看成员大小),同时最大成员大小为5字节(char [5]),而联合体大小必须是最大对齐数的整数倍,因此为8。

例题2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
union Un
{
    short s[7];  //14   最大成员大小为14字节
    int n;   //4   最大对齐数为4字节
};
 
int main()
{ 
    printf("%d\n", sizeof(union Un));
    return 0;
}

输出结果:

例题3

判断:联合体的大小是最大成员的大小(?)

分析:答案是错误的,联合体的大小至少是最大成员的大小,上面的例题已经说明。

上述例题基本过程为:也就是先找到成员的最大字节数(只看类型),之后再找到最大的成员,根据最大成员的大小和最大字节数的倍数来确定联合体的大小。

(本节完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值