C语言学习—结构体与共用体

·C语言引入了两种构造类型—结构体共用体是为了解决一些关系密切但数据类型不同的数据。


1.1结构体类型定义的一般形式:                                       2.1共用体类型定义的一般格式:

struct 结构体名      /*struct是关键字*/                              union  共用体名         /*union是关键字*/

{                                                                                    {

  结构体成员表;                                                               共用体成员表;

};                                                                                 };

1.2结构体变量的定义                                                        2.2共用体变量的定义                                                               struct data_type                                                              union data_type

{                                                                                     {

  int     i;                                                                            int     i;

  char  ch;                                                                         char  ch;

  float  f;                                                                           char  ch;

}x;   /*法1:定义结构体类型的同时定义该类型变量*/            }x;


·共用体与结构体的区别:共用体的定义虽然是以结构体为基础,但与结构体却有着本质的区别,它们的内存使用方式不同。

共用体是多种数据的覆盖存储,几个不同的成员变量共占同一段内存,且都是从同一地址开始存储的,只是任意时刻只存储一种数据,因此分配给共用体的存储区域大小至少要有存储最大一个数据所需的空间。而对于结构体来说,由于结构体中不同的成员分别使用不同的内存空间,因此一个结构体所占内存空间的大小应是结构体每个成员所占内存大小总和,而且,结构体中每个成员相互独立,不占用同一存储单元。


可以看出x在内存中占用2+1+4=7个字节(实际占用字节数依运行环境而定),而y在内存中只需占用4个字节(float型)。因而在程序设计中采用共用体比采用结构体节省空间。

说明:1)由于共用体变量不是同时存放多个成员的值,因此共用体变量不能进行初始化。

         2)由于共用体变量不是同时存放多个成员的值,而只是存放其中的一个值,因此在程序中改变共用体的一个成员,其他成员也会随之改变,最终共用体中所有成员共用一个值(最后赋的值)。

例如:a.1=10; a.ch='H'; a.f=9.9;   依次执行完上述三个赋值语句之后,最终只有a.f的值有效。

例:阅读下列程序,写出运行结果。

#include<stdio.h>

int main()
{
    union exa
    {
        struct
        {
            int a;
            int b;
        }out;
        int c;
        int d;
    }e;
    e.c=1;e.d=3;
    e.out.a=e.c;
    e.out.b=e.d;
    printf("\n%d,%d\n",e.out.a,e.out.b);
    return 0;
}

结果:3,3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值