联合体c语言指针,C语言联合体

联合体c语言指针,C语言联合体像结构体一样 联合体 Union 在 C 语言中是一个用户定义的数据类型 用于保存不同类型的元素 但它并不占所有成员的内存总和 它只占最大成员的内存 它分享最大成员的内存 联合体优点它占用较少的内存 因为它只占最大的成员的内存量 联合体缺点它将数据存储在一个成员中 定义联合体 union 关键字用于定义联合体 下面我们来看看如何在 C 语言中定义联合体的语法 unionunion name data ty

像结构体一样,联合体(Union)在C语言中是一个用户定义的数据类型,用于保存不同类型的元素。

但它并不占所有成员的内存总和。它只占最大成员的内存,它分享最大成员的内存。

6026af3d19e703971ce3d01cc68e3096.png

联合体优点

它占用较少的内存,因为它只占最大的成员的内存量。

联合体缺点

它将数据存储在一个成员中。

定义联合体

union关键字用于定义联合体。下面我们来看看如何在C语言中定义联合体的语法 –

union union_name

{

data_type member1;

data_type member2;

.

.

data_type memeberN;

};

我们来看看在C语言中定义员工联合体的例子。如下代码 –

union employee

{ int id;

char name[50];

float salary;

};

注:除了union关键字,其它均与结构体一样。

联合体的例子

我们来看看一个简单的C语言联合示例。创建一个源文件:union-example.c,其代码实现如下 –

#include

#include

union employee

{

int id;

char name[150];

}e1; //declaring e1 variable for union

int main()

{

//store first employee information

e1.id = 1010;

strcpy(e1.name, “Maxsu”);//copying string into char array

//printing first employee information

printf(“employee 1 id : %d, address: %u\n”, e1.id, &e1.id);

printf(“employee 1 name : %s, address: %u\n”, e1.name, &e1.name);

e1.id = 1010;

printf(“employee 1 id : %d, address: %u\n”, e1.id, &e1.id);

printf(“employee 1 name : %s, address: %u\n”, e1.name, &e1.name);

return 0;

}

执行上面示例代码,得到以下结果 –

employee 1 id : , address:

employee 1 name : Maxsu, address:

employee 1 id : 1010, address:

employee 1 name : ?, address:

如上输出结果中可以看到,id字段的值是一个垃圾值,因为name具有大的内存大小。所以只有name才具有实际值。

联合体完全就是共用一个内存首地址,并且各种变量名都可以同时使用,操作也是共同生效。如此多的访问内存手段,确实好用,不过这些“手段”之间却没法互相屏蔽——就好像数组+下标和指针+偏移一样。

由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。

下面举例说明:

union U

{

char s[9];

int n;

double d;

};

s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。然而其实际大小并不是9,用运算符sizeof测试其大小为16.这是因为这里存在字节对齐的问题,9既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除。

测试程序,创建一个源文件:union-test.c,其代码实现如下 –

#include

#include

union U1

{

char s[9];

int n;

double d;

}u1;

union U2

{

char s[5];

int n;

double d;

}u2;

int main()

{

printf(“%d\n”, sizeof(u1));

printf(“%d\n”, sizeof(u2));

printf(“0x%x\n”, &u1);

printf(“0x%x\n”, &u1.s);

printf(“0x%x\n”, &u1.n);

printf(“0x%x\n”, &u1.d);

u1.n = 1;

printf(“%d\n”, u1.s[0]);

printf(“%lf\n”, u1.d);

unsigned char *p = (unsigned char *)&u1;

printf(“%d\n”, *p);

printf(“%d\n”, *(p + 1));

printf(“%d\n”, *(p + 2));

printf(“%d\n”, *(p + 3));

printf(“%d\n”, *(p + 4));

printf(“%d\n”, *(p + 5));

printf(“%d\n”, *(p + 6));

printf(“%d\n”, *(p + 7));

return 0;

}

执行上面测试代码,得到以下结果 –

16

8

0xeca5a0

0xeca5a0

0xeca5a0

0xeca5a0

1

0.000000

1

0

0

0

0

0

0

0

¥ 我要打赏

纠错/补充

收藏

加啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个最多限加 3 个群。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215753.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午1:31
下一篇 2026年3月18日 下午1:31


相关推荐

  • TCP粘包和拆包

    TCP粘包和拆包Socket 为 TCP 长连接 TCP 为了保证可靠传输并减少额外的开销 每次发包都要验证 采用了基于流的传输 基于流的传输不认为消息是一条一条的 是无保护消息边界的 保护消息边界 指传输协议把数据当做一条独立的消息在网上传输 接收端一次只能接受一条独立的消息 会存在粘包拆包问题 UDP 则是面向消息传输的 是有保护消息边界的 接收方一次只接受一条独立的信息 所以不存在粘包拆包问题 TCP 是个流协议 就是没有界限的一串数据 TCP 底层并不了解上层业务数据的具体含义 它会根据 TCP 缓冲区的实际情况进行包的划分 所

    2026年3月17日
    2
  • 顺序图(Sequence Diagram)

    顺序图(Sequence Diagram)交互图用来描述系统中的对象是如何进行相互作用的 即一组对象是如何进行消息传递的 交互主要用于描述协作的动态行为方面 当对交互建模时 通常既包括对象 每个对象都扮演某一特定的角色 又包括消息 每个消息都代表对象之间的通信活动 并导致一定的动作发生

    2026年3月16日
    2
  • 微信公众号网页授权登录[通俗易懂]

    微信公众号网页授权登录[通俗易懂]微信公众号网页授权登录:前端时间做了一个微信公众号的项目,就是微信公众号的菜单点击我的个人中心,就向用户授权登录获取用户的信息,进行业务逻辑的操作,微信公众号官方文档,这是我写的文章,里面有很多微信的官方文档,希望对大家有用:https://blog.csdn.net/qq_41971087/article/details/82466647在微信公众号官方文档中,看到微信页面开发,…

    2022年6月5日
    38
  • 基于1DCNN(一维卷积神经网络)的机械振动故障诊断

    基于1DCNN(一维卷积神经网络)的机械振动故障诊断基于1DCNN(一维卷积神经网络)的机械振动故障诊断机械振动故障诊断最为经典的还是凯斯西储实验室的轴承故障诊断,开学一周了,上次改编鸢尾花分类的代码可用,但是并不准确。开学一周重新改编了别人的一篇代码,亲测好用。不多咧咧直接放上去(基于Tensorflow2.0)(Spyder4软件上跑的)数据集时本人把凯西轴承实验驱动端内圈损坏尺寸0.14和0.21做的二分类,数据集中0代表的0.14而1代表的0.21具体看下面最后#-*-coding:utf-8-*-“””CreatedonTue

    2022年6月8日
    101
  • 如何将excel中的数据导入mysql_将外部sql文件导入MySQL步骤

    如何将excel中的数据导入mysql_将外部sql文件导入MySQL步骤客户准备了一些数据存放在excel中,让我们导入到mysql中。先上来我自己把数据拷贝到了txt文件中,自己解析txt文件,用JDBC循环插入到数据库中。后来发现有更简单的方法:1先把数据拷贝到txt文件中2打开mysql命令行执行下面的命令就行了LOADDATALOCALINFILE’C:\\temp\\yourfile.txt’INTOTA…

    2026年2月7日
    4
  • L1正则化的理解(l1和l2正则化代表什么意思)

    在论文中看到L1正则化,可以实现降维,加大稀疏程度,菜鸟不太懂来直观理解学习一下。在工程优化中也学习过惩罚函数这部分的内容,具体给忘记了。而正则化正是在损失函数后面加一个额外的惩罚项,一般就是L1正则化和L2正则化。之所以叫惩罚项就是为了对损失函数(也就是工程优化里面的目标函数)的某个或些参数进行限制,从而减少计算量。L1正则化的损失函数是是不光滑的,L2正则化的损失函数…

    2022年4月16日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号