结构体struct和联合体union最全讲解

您所在的位置:网站首页 结构体中字节对齐什么意思 结构体struct和联合体union最全讲解

结构体struct和联合体union最全讲解

2023-12-28 01:54| 来源: 网络整理| 查看: 265

摘要:首先感谢三位博主,并做出总结.

首先了解一下struct的储存结构:

一、结构体的访问 1.结构体成员的的直接访问,如下结构体:

struct  A{

           int a;

           long *b;

           char c[20];

};

struct A   com;

结构体成员通过操作符"."访问,表达式com.a的结果是个数组名,可以把它使用在任何可以使用数组名的地方,com.a[4],将选择一个数组元素。

2、结构体成员的间接访问

struct A *p;

可以使用(*p).a访问结构体成员,但这种形式有点不简洁所以使用操作符"->"来访问结构体成员,箭头操作符对左操作数执行间接访问来获取指针所指向的结构,然后根据右操作数来访问一个成员,p->a。

二、结构体的自引用

struct B{

         int a;

         struct B b;

         int c;

};

这种引用是不合法的,因为b是一个完整的结构,第二个成员又是另一个完整的结构,还包括她自己的成员,这样会循环下去无法及所结构体的大小。

struct B{

         int a;

         struct B  *b;

         int c;

};

这种声明是合法的,b现在是一个指针它所占的字节数是已知的,可以计算出结构体的大小,这种自引用是合法的。

三、结构体、指针和成员

typedef   struct{

    int a;

    short b[2];

}Ex1;

typedef   struct{

    int a;

    char b[3];

    Ex1 c;

    struct Ex1 d;

}Ex2;

Ex2 x={1,"My",{2,{3,4}},0};

Ex2 *p=&x;

如下图来表示此结构:

创建一个指向整型的指针:int *p1;若要使它指向整型成员a,应使用&取得一个指向p->a的指针:p1=&p->a.

访问嵌套的结构体:p->c.a即为访问c结构体中的整形a。

访问指针成员:定义另一结构:Ex y;     x.d=&y;则Ex->d->c.b[1]=4;则表示如下图空间:

四、结构体的内存对齐

对齐规则

每个特定平台上的编译器都有自己的默认“对齐系数”,也可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1、数据成员对齐规则:struct数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。(即第一个数据成员以后的成员的偏移地址为#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个的整数倍) 2、struct的整体对齐规则:在数据成员完成各自对齐之后,结构体本身也要进行对齐,对齐将按照#pragma pack指定的数值和struct最大数据成员长度中,比较小的那个进行。 3、当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。      当结构体里面包含另一结构体时,直接将该结构体中的内容代换进去,计算其总的存储空间即可。

例:(在此平台上int占4个字节)

虽然A和A1所包含的成员相同,但A占了12个字节,A1占8个字节,所以在声明中对结构体列表的排列,因该让边界要求严格的成员首先出现(数据成员自生长度大的先出现)

以上转载自:https://www.cnblogs.com/Blog-day/p/MY_Blog_Days-3.html

1.联合体union的基本特性——和struct的同与不同

union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

不过区别也挺明显:

结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

 

 

2.双刃剑——多种访问内存途径共存

一个例子了然ÿ



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3