结构体与共用体(联合体)

2023-10-31

参考:结构体与共用体
作者:一只青木呀
发布时间: 2020-08-09 08:29:22
网址:https://blog.csdn.net/weixin_45309916/article/details/107889394

参考:联合体(union)的使用方法及其本质
作者:秦伟H
发布时间:2014-04-13 14:27:08
网址:https://blog.csdn.net/huqinweI987/article/details/23597091?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162847148716780366592652%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162847148716780366592652&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-23597091.first_rank_v2_pc_rank_v29&utm_term=%E8%81%94%E5%90%88%E4%BD%93&spm=1018.2226.3001.4187

结构体

什么是结构体?

用来存储不同类型的(数组存储的是同种类型数据)数据

定义结构体

struct 结构体名字{

   	需要存储的类型或者数组
   	
};

例:

struct student
     {
          char name[20];
          int id;
     };

实际中,保存的数据一般不会是同一种类型。而结构体的大小也不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题。

由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:

一、结构体成员的偏移量必须是成员大小的整数倍

二、结构体大小必须是所有成员大小的整数倍

具体计算方法参照这篇博文结构体对齐计算方式

定义结构体变量:

struct student stu1;这样就是定义一个结构体类型的变量,这样就能够使用这个结构体变量来存东西,其实就是给结构体里面的变量赋值,使用方式:stu1.id=12;直接‘ . ’出成员赋值即可。

定义结构体数组: struct student stu[10];这样就是定义一个结构体数组,这样就能狗使用这个结构体数组来存10个信息,使用方式:stu[0].id=12;跟上面一个直接 ’ . ’ 出成员赋值及即可。stu[0]就是表示第一个结构体变量

匿名结构体:

struct
{      

  	int id;
	char b;
}p;

这样想当然定义了结构体变量,变量名是p,要写就变量就在后面接几个变量名

实现给结构体取别名

typedef struct{

 
}Str;

Str s;  //可以直接定义结构体变量

结构体嵌套

struct Node{

         int a;

         int b;

    };

struct Str{

    struct Node n;

}

 

//示例

struct Str s;

s.n.a=10;

s.n.b=20; 

联合体

概念

联合体又称共用体

union 名字{成员};

联合的所有成员引用的是内存中的相同位置,以最大的成员的内存长度作为union的内存大小

定义:


union Node{

 	 char c;

  	 short s;

   	 int a;

    double d;

};

联合体虽然可以有多个成员,但同一时间只能存放其中一种

和struct的异同

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

不过区别也挺明显:

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

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

共用内存地址

#include<stdio.h>
union var{
        long int l;
        int i;
};
int main(){
        union var v;
        v.l = 1;
        printf("v.l is %d\n",v.i);
        v.i = 2;
        printf("now v.l is %ld! the address is %p\n",v.l,&v.l);
        printf("now v.i is %d! the address is %p\n",v.i,&v.i);
        
        system("pause");  
        return 0;
}

在这里插入图片描述
所以,union叫共用体还真是贴切——完全就是共用一个内存首地址,并且各种变量名都可以同时使用,操作也是共同生效。如此多的access内存手段,确实好用,不过这些“手段”之间却没法互相屏蔽——就好像数组+下标和指针+偏移一样。

union所占内存空间大小

前面说了,首先,union的首地址是固定的,那么,union到底总共有多大?根据一些小常识,做个不严谨不高深的基础版验证吧。

根据:分配栈空间的时候内存地址基本上是连续的,至少同类型能保证在一起,连续就说明,我如果弄三个结构体出来,他们三个地址应该连着,看一下三个地址的间隔就知道了,也可以用sizeof直接看,就知道union的大小了。

#include<stdio.h>
union sizeTest{
        int a;
        double b;
};
main(){
        union sizeTest unionA;
        union sizeTest unionB;
        union sizeTest unionC;
 
        printf("the initial address of unionA is %p\n",&unionA);
        printf("the initial address of unionB is %p\n",&unionB);
        printf("the initial address of unionC is %p\n",&unionC);
        
        system("pause");  
        
}

在这里插入图片描述

很容易看出,8,0,8,这间隔是8字节,按double走的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体与共用体(联合体) 的相关文章

  • 宏定义的正确写法,三目运算的宏定义

    转自 宏定义的正确写法 三目运算的宏定义 https my oschina net iOScoderZhao blog 916074 第一阶段 对象宏 define M PI 3 141592653589793238462643383279
  • C语言基础:数据类型(一)

    C语言基础 数据类型 一 C语言是计算机中很多现代编程语言的开山鼻祖 它创造了信息时代和科技时代的文明 计算机语言由机器语言慢慢演变为高级语言 1958年7月3日 ALGOL语言 Algorithmic Language 创立 C语言的原型
  • static用法

    本用法针对于C语言 文中所用代码在Qt中均运行成功 static 主要用法 修饰变量 修饰函数 1 修饰变量 形成动态变量和静态变量 动态变量 不使用static include
  • C语言面试高频问题:自己代码实现字符串相关的常用API

    参考 C语言面试高频问题 自己代码实现字符串相关的常用API 作者 图触靓 发布时间 2020 08 08 13 31 33 网址 https blog csdn net bhbhhyg article details 107878102
  • C基础day3(2023.7.3)

    一 Xmind整理 二 作业 1 include
  • day5笔记

    10 删除目录 删除空目录 rmdir 路径 目录名 示例 rmdir day1 11 创建文件 touch 路径 文件名 示例 touch 1 c touch 2 c day2 2 txt 12 删除文件 rm 路径
  • 多文件编辑作业(2023.1.10)

    第一题 main c include head h int main int argc const char argv char str hello my student int start 0 int end strlen str 1 M
  • 五大板块(5)——字符串

    参考 五大板块 5 字符串 作者 丶PURSUING 发布时间 2021 03 18 16 03 48 网址 https blog csdn net weixin 44742824 article details 114982019 目录
  • 黑马程序员之---C学习笔记之printf与scanf使用及注意事项

    Java培训 Android培训 iOS培训 Net培训 一 printf函数介绍 printf函数是一个标准库函数 能够以精确的格式输出程序运算的结果 1 格式字符串 是由格式字符 包括 转换说明符 标志 域宽 精度 和普通字符组成 转换
  • # 和 ## 的区别

    参考 和 的区别 作者 枕上 发布时间 2021 07 25 08 23 40 网址 https blog csdn net jinchi boke article details 119076280 utm source app app
  • C语言入门日记

    参考 C语言入门日记 作者 9art0 发布时间 2020 08 30 16 37 46 网址 https blog csdn net GatoWong article details 108307915 spm 1001 2014 300
  • C基础day6(2023.7.6)

    一 Xmind整理 二 课上练习 练习1 循环嵌套 三个循环结构可以任意嵌套 include
  • C语言之进制转换

    文章目录 一 基础知识 1 C语言中的进制 2 汇编中的进制 3 常见进制的基数 4 不同进制的输出方式 二 十进制转为其它进制 三 任意进制转为十进制 四 二进制与十六进制的互相转换 1 二进制转为十六进制 2 十六进制转为二进制 五 二
  • Problem E: C语言习题5.21--算法:汉诺塔

    Problem E C语言习题5 21 算法 汉诺塔 Time Limit 1 Sec Memory Limit 64 MB Description 汉诺塔 又称河内塔 问题是印度的一个古老的传说 开天辟地的神勃拉玛在一个庙里留下了三根金刚
  • C语言之自定义函数的实现

    自定义函数的作用 方便管理代码 编写程序时思路清晰 代码复用 同一段代码可以在不同位置多次执行 函数声明 使用 返回值类型 函数名 类型 变量名 类型 变量名 例如 int sum int num1 int num2 实际上 在函数声明时
  • STL--map的应用

    STL之map的应用 map定义及用途 map翻译为映射 是STL中的常用容器 其实 数组就是一种映射 比如 int a 100 就是定义了一个int到int的映射 而a 5 25 就是把5映射到25 数组总是将int类型映射到其它基本类型
  • 经典C语言程序设计100例,部分有个人注解

    经典C语言程序设计100例 程序1 题目 有1 2 3 4个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 1 程序分析 可填在百位 十位 个位的数字都是1 2 3 4 组成所有的排列后再去 掉不满足条件的排列 当然这里的去掉并不
  • day3笔记

    1 4 mkdir指令 创建目录 mkdir d1 在当前目录下创建d1目录 mkdir d3 d4 在当前目录下创建多个目录 mkdir dir1 dir2 p 在当前目录下创建目录dir1下的dir2目录 1 5 rmdir命令 作用
  • 双链表嵌套的简单学生信息管理系统

    参考 实现双链表嵌套的简单学生信息管理 作者 三速何时sub20 发布时间 2020 07 20 10 44 40 网址 https blog csdn net weixin 44234294 article details 1074581
  • C语言之指针知识大总结

    文章目录 一 地址 二 指针与指针变量 三 指针的作用 四 初学指针时常见的错误 五 通过调用函数修改主调函数中的值 六 指针与一维数组 七 使用函数操作一维数组 八 指针变量所占字节数 九 静态数组的缺陷 十 malloc函数 十一 动态

随机推荐

  • 西门子828d车削编程技术_干!货!来!啦!西门子数控系统车削加工编程合集...

    哈喽 艾瑞巴蒂 如昨天预告所说 今天我们一大早就送来了诚意满满的干货 小伙伴们是不是在车床加工时遇到过手拿图纸 但不知该如何下手 如何在控制器里编程 程序开头和结尾有啥注意事项 子程序怎样编写 怎么保证螺纹的切削效果 车铣复合如何编程 等等
  • 计算机英语名词简释(轉載)

    计算机英语名词简释 一 著名公司及其商标名 Microsoft 有时缩略为MS 是全球最著名的软件商 美国软件巨头微软公司的名字 Microsoft其实是由两个英语单词组成 Micro意为 微小 Soft意为 软的 此处应为 Softwar
  • Spring boot 启用 Spring Data JPA Auditing(审计功能)

    一 Auditing功能简介 先贴上Spring Data JPA的官方文档 https docs spring io spring data jpa docs 2 0 9 RELEASE reference html 项目中每条数据在创建
  • 利用C语言 找出数组中的最大值和最小值

    include
  • cpuz北桥频率和内存频率_搞清楚时序与频率,买内存条就不会入坑

    很多时候购买者都会忽视在电脑中起到不可忽视作用的CPU以及硬盘 购买内存的时候 人们更加关注的也是它的价格以及所拥有的容量 而并非性能上的命门 频率 以及 时序 很多人表示好奇 究竟何为频率 所谓内存的频率 指的是在内存工作的过程中 以兆赫
  • 统计学中常见的分布汇总及相关概念

    常见分布 统计学中有很多常见的分布 在此对这些分布进行梳理 离散型随机变量分布 1 离散型均匀分布 若随机变量有n个不同值 具有相同概率 则我们称之为离散均匀分布 通常发生在我们不确定各种情况发生的机会 且认为每个机会都相等 例如 投掷骰子
  • datalab详细解析

    本博客参考了链接https blog csdn net qq 42792383 article details 86824293 特在此鸣谢 以下为datalab的部分解析 1 bitXor x y using only and Examp
  • Centos 部署Oracle 11g

    Centos 部署Oracle 11g 部署Oracle 11g 准备工作 服务器信息 oracle安装包 服务器准备oracle环境 安装Oracle 静默方式配置监听 以静默方式建立新库及实例 部署Oracle 11g 在SpringM
  • 传感器学习——蓝牙模块HC-05

    传感器学习 蓝牙模块HC 05 硬件连接VCC 接电源的正极 这里需要接 5V GND 接电源的负极 RXD 接收端 蓝牙模块接收从其他设备发来的数据 正常情况接其他设备的发送端TXD TXD 发送端 蓝牙模块发送数据给其他设备 正常情况接
  • 玩转Mysql系列 - 第7篇:玩转select条件查询,避免采坑

    这是Mysql系列第7篇 环境 mysql5 7 25 cmd命令中进行演示 电商中 我们想查看某个用户所有的订单 或者想查看某个用户在某个时间段内所有的订单 此时我们需要对订单表数据进行筛选 按照用户 时间进行过滤 得到我们期望的结果 此
  • mac电脑安装paste教程以及重新安装软件后不能使用解决方法

    问题背景 mac电脑安装paste教程以及重新安装软件后不能使用解决方法 mac电脑安装paste失败 安装好后还是无法使用 paste显示还是历史粘贴信息 导致无法使用 新 copy的内容也无法进入历史粘贴版里面 笔者电脑配置信息 Mac
  • PostgreSQL 锁表

    PostgreSQL 锁表解决 解决 一 碰到的问题 Navicat删除表是一直转圈 出现问题的原因 短时间多次对同一张表进行查询造成表死锁 解决思路 通过查询进程把锁住的pid查出来然后解锁 1 查询正在运行的进程 datname为数据库
  • sqlserver连接字符串_10分钟使用EF Core连接MSSQL数据库

    给DotNet加星标 提升 Net技能 转自 Ron liang cnblogs com viter p 10243577 html 前言 在 NET Core 2 2中Microsoft AspNetCore App 默认内置了Entit
  • 【UE】读写配置文件 ue读写ini文件

    UE读写ini文件 前言 1 新建C 文件 2 编写代码 2 1 头文件h文件 2 2 cpp文件 3 函数说明 3 1 写入ini 3 2 读取ini 4 打包后读取ini数据 4 1 打开Editor时的Game ini 4 2 打包后
  • 快速成长的秘诀|学会自我培养和培养他人

    快速成长总共三篇 分别是 完成自我认知升级 自我成长好方法 和 自我培养和培养他人 本篇是第三篇 篇幅较长 针对长文的阅读方式 依旧建议在 完成自我认知升级 中提到的阅读方式 在一个不被打扰的时间做好只字不差阅读 用批判性思维思考和理解其中
  • 银行从业中级系列课程之——内容概述

    课程初衷 由于在体制内工作 银行从业已经成了内部要求 本人连续两年重在参与了 终于决定为了奖励的400元战斗一下 同时提升下个人的银行从业水平 课程简介 本课程根据2021年课程大纲进行汇总 同时结合了233网校的课程内容进行了编写 力求能
  • linux编译mesa,编译安装 Mesa (OpenGL)

    最近因为工作需要 想看一下 OpenGL 的东西 就在笔记本上搭建了 OpenGL 的环境 解压后 运行 configure 根据提示安装必要的包 编译 安装 我安装到了 usr local private 下面 usr local pri
  • 佳威线管分级说明

    次次底级 keb sl刹车 次底 cgx sl刹车 lex sl变速 底级 无润滑 cex刹车 lex变速
  • Spark Task的各个动作时间来源以及Task Schedule Delay 问题排查

    背景 发现线上偶尔会出现一些Spark Task会显示Schedule Delay数分钟甚至十几分钟 所以要排查原因 Task 时间分析以及Schedule Delay计算公式 如图所示 时间轴上面的表示Driver 记录到的各个时间 时间
  • 结构体与共用体(联合体)

    参考 结构体与共用体 作者 一只青木呀 发布时间 2020 08 09 08 29 22 网址 https blog csdn net weixin 45309916 article details 107889394 参考 联合体 uni