首页 > 其他分享 >c语言,联合体

c语言,联合体

时间:2024-03-17 18:30:12浏览次数:27  
标签:语言 int 联合体 char union un printf

一.什么是联合体:

像结构体一样,联合体也是由一个或多个成员变量组成的这些成员变量可以是不同的类型,但编译器只给最大成员分配足够的内存,联合体体内的成员都是公用一块空间的,因此联合体也叫做共同体

二.联合体类型的声明:

union Un//
{
 char c;
 int i;
};
int main()
{
	union Un un={0};//
	printf("%d",sizeof(un));
	return 0;
}
//输出结果为4

和结构体很像其实

三.联合体的特点:

#include <stdio.h>
union Un
{
 char c;
 int i;
};
int main()
{
 union Un un = {0};
 printf("%p\n", &(un.i));
 printf("%p\n", &(un.c));
 printf("%p\n", &un);
 return 0;
}
//最终三个输出结果都指向同一地址,更加说明了联合体内元素成员公用同一地址

四.结构体和结合体储存的区别:

在这里插入图片描述

五.联合体大小的计算:

#include<stdio.h>
union Un1
{
char a[6];
int b;
};
union Un2
{
short c[5];
int d;
};
int main()
{
printf("%d/n",sizeof(Un1));
printf("%d/n",sizeof(Un2));
return 0;
}
//输出结果为8 16

在Un1中虽然int 的类型要比char大,但char有五个元素,也就需要五个字节,在这种情况下,short就可以看做是Un1中最大的成员,那为什么最终输出结果是8而不是五呢?和结构体的规则类似,即使是联合体也需要最终成员元素和偏移值的对齐数为某个整数的倍数。
那么Un2也和Un1一同理,short 有六个元素,需要12个字节的大小,祖自宏结果又需要为某个整数的倍数,所以输出结果为16,而非12,。

六.联合体的应用:

那既然有结构体了,结构体也很方便和联合体也很像为什么还要学习联合体?答案就是在某些场景下联合体所占内存空间更少,可以减少无意义内存的占用。比如
为百货商店内的各类商品(书籍,裙子,玩具)便于管理,而设置一个程序:
解题:
先来分析三者都具有些什么属性:
书籍:价格,名称,作者
裙子:价格,名称,尺码
玩具:价格,名称,材质
三者具有相同的属性为价格,名称,不同的属性为作者,尺码,材质
如果仅仅通过结构体来编程,那最终的编程结果就是三个结构体

struct comm
{
//公共属性
price b;
name o;
//特殊属性
auther k;
size r;
tex z;
};

可是对于上述代码,在调用书籍的三个属性时裙子和玩具的特殊属性所占空间就被浪费掉了,但是如果通过联合体就可以避免空间被浪费

struct comm
{
   double price ;
   char name [20];
   union a
  {
       struct book
       {
       char auther [20];
       };
       struct skirt
       {
        char size [20];
       };
       struct toy
       {
       char tex [20];
       };
   };
};

通过联合体修改后的代码就可在需要调用的书籍的三个属性时不会使裙子和玩具的特殊属性也占用空间了

标签:语言,int,联合体,char,union,un,printf
From: https://blog.csdn.net/hot_water_oh/article/details/136785328

相关文章

  • C语言程序设计——实验报告 1
    *实验项目名称:实验一熟悉C语言运行环境*实验项目类型:验证性*实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、......
  • 基于C语言实现整数行列式
    在本文章内,将会实现行列式的建立、销毁、打印、计算四个操作。鉴于笔者技术有限,此行列式只针对整数int型,请读者自行扩充~_~。1.行列式的建立与销毁我们首先建立行列式的数据类型,由于行列式规模的不确定,采用动态分配方法。typedefstruct{ intn; int*p;}determinant;......
  • C语言的宏和预处理器
    预处理器的作用预处理器在实际编译发生之前扮演着重要的角色,它处理各种预处理指令,这些指令包括宏定义(#define)、文件包含(#include)、条件编译(#ifdef、#ifndef、#if、#else、#elif、#endif),以及编译错误(#error)和行控制(#line)。示例代码://条件编译#defineDEBUG1#......
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }
    今日分享:字符、字符串函数和内存函数内存函数就是对内存进行操作的函数字符串函数就是对字符串进行操作的函数字符函数就是对字符进行操作的函数str前缀的函数是字符串函数,头文件string.hmem前缀的函数是内存函数,头文件stdlib.h字符函数与字符串函数以及内存函数......
  • C语言分支与循环(二)
    前言通过上一篇文章了解完条件分支语句中的if语句相关知识后,其实除了if语句外,C语⾔还提供了switch语句来实现分⽀结构。接下来我将介绍switch语句,废话不多说,我们直接开始吧!switch语句的基本形式switch(表达式){ case情况1: 语句块1; case情况2: 语句块2; ... ca......
  • # c语言程序设计——实验报告
    实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、......
  • c语言程序设计--实验报告一
    实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、......
  • C语言指针与数组(不适合初学者版):一篇文章带你深入了解指针与数组!
    ......
  • C语言指针(适合C语言进阶者):一道题带你深入理解数组与指针的关系
    ......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    ......