C语言中的共用体(联合体)

共用体的关键概念

  1. 内存共享: 共用体的所有成员在同一内存位置上存储数据,因此在任意时刻,只有一个成员是有效的。其他成员会被覆盖。换句话说,共用体中的成员共享内存空间,每次只能存储一个成员的值。

  2. 内存大小: 共用体的大小是它所有成员中最大的成员所占用的空间大小。例如,您的Data共用体中,str是一个20字节的数组,因此整个共用体的大小是20字节,而不是成员大小的总和。

  3. 用途: 共用体通常用于节省内存,特别是当您知道某个数据结构中不同成员不会同时使用时。它适合用来存储几种不同类型的数据,但每次只能用一个成员。

共用体的定义和访问

  1. 定义共用体: 您通过union关键字来定义共用体,它的格式如下:

    union Data {
        int i;
        float f;
        char str[20];
    };
    

    这里定义了一个名为Data的共用体,它包含一个int类型的成员i,一个float类型的成员f,以及一个字符数组str,它可以存储一个字符串。

  2. 访问共用体成员: 使用.运算符来访问共用体成员。例如,data.i表示访问Data共用体的i成员,data.f表示访问f成员,data.str表示访问str成员。

示例分析

示例 1:内存占用
#include <stdio.h>
#include <string.h>

union Data {
   int i;
   float f;
   char str[20];
};

int main() {
   union Data data;        
   printf("Memory size occupied by data: %d\n", sizeof(data));
   return 0;
}

输出

Memory size occupied by data: 20

在此例中,Data共用体的大小是20字节,因为str成员是一个20字节的字符数组,而if的大小分别是4字节(在大多数平台上),共用体的大小是最大的成员所占的空间,即20字节。

示例 2:存储多个值并覆盖
#include <stdio.h>
#include <string.h>

union Data {
   int i;
   float f;
   char str[20];
};

int main() {
   union Data data;        
   data.i = 10;
   data.f = 220.5;
   strcpy(data.str, "C Programming");

   printf("data.i : %d\n", data.i);
   printf("data.f : %f\n", data.f);
   printf("data.str : %s\n", data.str);

   return 0;
}

输出

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

在这个例子中:

  • data.i = 10 将整数10存储到i成员。
  • data.f = 220.5 将浮点数220.5存储到f成员,覆盖了i成员中的值。
  • strcpy(data.str, "C Programming") 将字符串存储到str成员,覆盖了f成员的值。

因此,虽然您对多个成员进行了赋值,但实际上每个赋值操作都覆盖了前一个成员的数据。由于共用体的成员共享相同的内存空间,只有最后一个有效的成员(即str)能够正确显示,而其他成员的值变得无效。

示例 3:只使用一个成员
#include <stdio.h>
#include <string.h>

union Data {
   int i;
   float f;
   char str[20];
};

int main() {
   union Data data;        
   data.i = 10;
   printf("data.i : %d\n", data.i);
   
   data.f = 220.5;
   printf("data.f : %f\n", data.f);
   
   strcpy(data.str, "C Programming");
   printf("data.str : %s\n", data.str);

   return 0;
}

输出

data.i : 10
data.f : 220.500000
data.str : C Programming

在这个例子中:

  • 先将整数10存储到data.i,然后输出。
  • 然后将浮点数220.5存储到data.f,覆盖了data.i
  • 最后,将字符串"C Programming"存储到data.str,覆盖了data.f

您可以看到,虽然依次给共用体的不同成员赋值,但是每次只有一个成员的值有效,其他成员的数据被覆盖。

总结

  • 共用体允许在同一内存位置存储不同类型的数据,但在同一时刻只能存储一个成员的有效数据。
  • 共用体的大小是它最大成员的大小,内存空间是共享的。
  • 在使用共用体时,需要小心覆盖数据的问题,通常使用标志变量来确保只访问当前有效的成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值