结构体struct 联合体 union

今天我们来复习c语言提供的两种聚合数据类型(aggregate data type):数组和结构,其中之一“结构”。

今天的第一个复习问题来了,什么是聚合数据类型?

聚合数据类型,顾名思义就是将具有某一共同属性的数据通过特定方式或者结构结合起来,简言之,就是能够同时存储超过一个的单独数据。当然我们接下来就要先复习结构了。

第二个问题,那联合体又是什么呢?

一、结构

我们先来设想一个下面这样的场景,新生入学报道填表,每个新生都要在舍管阿姨那张表里填上自己的学号、姓名、房号、手机号和专业班级。

c语言提供两种聚合数据类型,数组和结构。数组是形状大小完全相同的格子组成,即类型完全相同的元素集合,它的每一个元素都是可以通过下标引用或者指针间接访问来选择的。结构和数组不同,它存储的每个元素就像新生入学表里每个人的学号和姓名一样是各不相同的数据类型,它的这些值称为成员(member),结构里各成员的长度不同所以不能通过下标访问,需要通过它们的名字访问它们。

  • 声明一个结构

我们现在来动手声明一个结构:

struct tag { 
mumber-list 
} variable-list; //声明结构时,我们必须要列出这个结构包含所有成员的列表,列表包括每个成员的类型和名字
struct  sample  { 
                   int   a;
                   float   b;
                   char   c;
} x ;
...
struct  sample  { 
                   int   a;
                   float   b;
                   char   c;
} y[20], *z;

以上声明创建了一个名叫x的变量,一个含有20个元素名叫y的数组变量,一个指向结构变量的指针。我们可以看到上面两结构完全相同,但在c语言里,以上这种情况下面出现这种赋值就是非法的

z=&x;

为什么?因为在上面的结构声明中虽然两个sample都包含一个名为a的整型,一个名为b的浮点型,一个名为c的字符型,但它在计算机眼里是完全不同的两个结构变量,好比现实生活中的双胞胎一样。那怎样处理上述情况呢?

struct sample {
                int a;
                float b;
                char c
 };
struct sample x;
struct sample y[20],*z;
z=&x;//此时该语句合法
  • 结构成员的直接访问

我们点操作符直接访问结构变量的成员,点操作符接受两个操作数。我们再声明一个更复杂的结构:

struct complex{
               int   a[20];
               long  *p;
               struct sample sa[10];
               struct sample s;
               struct sample *sp;
  }com;

现在我们看下面几个栗子:

表达|解释

----|-----

com.a[1]|com结构中成员数组a中的第二个元素

(com.sa)[3]|com结构中名为sa的结构数组成员中第四个元素

com.s.a|com结构中名为s结构成员中的a成员

com.sa)[4].b|com结构中名为sa结构数组成员的第五个元素结构中的b浮点数

结构成员的间接访问

说到间接访问第一个就要想到指针,我们还是看上面的com栗子。我们令:

(*sp).b=3.14;

则如何用外部指针间接访问结构中的成员呢?c语言为我们提供了一个更为方便的操作符)—— “箭头操作符(->)”。如何使用呢?

p->b;//即可,注意箭头操作符的优先级非常高

下面我们来做一个有意思的改动?:

sp->a=0;

把a赋值为0,所以(*sp).a的值与sp->a的有值相同都为零。现在我们来玩一个有意思的魔法,好了一起来,准备好你们的魔法棒,变!sp->a,这里的间接访问符作用与a存储内容代表的指针值,而a本身的内容为0,即为null空指针,所以它不会指向任何东西。对一个null指针进行解引操作是个错误,但正如我们昨天讨论的一样,有些环境运行时,机器根本不会捕捉到这个错误。

二.联合体union

  • 声明一个联合

联合和结构类似,但行为方式和结构不同。联合中所有成员引用的是内存中相同的位置。先让我们看一个简单的例子。

union {
           float f;
           int i;
  }fi;

在一个int和float都为32位的机子上,变量fi只占32位,如果变量中的浮点型被引用,这个字就做为浮点型访问,当然也可以通过其他形式打印出来,比如下面这个操作:

fi.f=3.14;
printf("%d\n",fi.i);

把圆周率的浮点表示存储于fi,然后把这些相同的位当作整形值打印输出。

  • 联合的初始化

联合变量可以被初始化,这个初始化变量必须是联合第一个成员的类型,而且必须位于花括号内。举例?:

union {
           int f;
           float i;
           char a[10];
  } x = { 5 };

即把x.f初始化为5.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 结构体struct)和联合体union)都是C语言中用于定义自定义数据类型的方式,它们的区别在于: 1. 结构体中的各个成员在内存中是分开存储的,而联合体中的各个成员在内存中是共用同一块空间的。 2. 结构体的大小至少是其各个成员大小之和,因为每个成员都需要占用一定的内存空间,而联合体的大小则是其最大成员的大小,因为联合体中只有一个成员会被使用,其它成员则会被浪费。 3. 结构体中的各个成员可以同时被访问和修改,而联合体中只有一个成员可以被访问和修改。 4. 结构体可以存储不同类型的成员,而联合体只能存储同一类型的成员。 总之,结构体适合用于存储多个不同类型的数据,而联合体适合用于存储多个相同类型的数据,且只有一个数据会被使用的情况。 ### 回答2: 结构体struct联合体union都是在C语言中用来组织多个不同类型的变量的一种方式。它们的区别在于变量的存储方式和内存占用。 结构体struct是一种可以存储不同类型的变量的自定义数据类型。它通过定义多个不同类型的变量,并将它们组合在一起,形成一个新的类型。结构体中的每个成员变量都使用独立的内存空间,大小根据成员变量的类型而定。结构体的成员可以同时存在于内存中,因此结构体可以存储和处理多个不同类型的数据。 联合体union也是一种可以存储不同类型的变量的自定义数据类型。它与结构体不同的是,联合体的成员变量共享同一块内存空间,也就是说,联合体的各个成员变量会在同一时间占用该内存空间。联合体的内存空间大小会根据最大的成员变量类型来决定。而为了节约内存空间,联合体只能同时存储和处理一个成员的数据。 结构体联合体的使用方式也不同。结构体通常用于组织多个相关的变量,可以同时访问和修改结构体的各个成员变量。而联合体通常用于存储不同类型的变量,根据不同的需求来访问和修改特定的成员变量。 综上所述,结构体联合体在存储方式、内存占用和使用方式上都有所不同,开发者要根据实际需求选择合适的数据类型。 ### 回答3: 结构体struct联合体union是C语言中的两种复合数据类型。 结构体struct允许将不同类型的变量(如整型、字符型、浮点型等)组合在一起,形成一个逻辑上的整体。它可以定义多个成员变量,每个成员变量可以有不同的数据类型和名称。通过使用结构体,可以更方便地管理和操作相关的数据。 而联合体union也是用来组合不同类型的变量,不同于结构体的是,联合体的所有成员变量都共享同一块内存空间。联合体的大小取决于成员变量中占用内存空间最大的数据类型。只能同时使用其中的一个成员变量,存取一个成员变量会覆盖之前存入的值。通过使用联合体,可以节省内存空间,但在数据使用时需要小心,确保不会出现意外的数据覆盖。 总结来说,结构体struct联合体union的区别是: 1. 结构体允许不同类型的成员变量,而联合体中的成员变量必须是相同的类型。 2. 结构体的成员变量占用不同的内存空间,联合体的成员变量共享同一块内存空间。 3. 结构体的大小等于所有成员变量所占内存空间的总和,联合体的大小等于最大的成员变量所占内存空间。 4. 结构体的所有成员变量可以同时使用,而联合体只能同时使用一个成员变量。 5. 结构体适用于存储和操作不同类型的相关数据,联合体适用于节省内存空间、只需存取其中一个成员变量的情况下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值