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

参考:结构体与共用体
作者:一只青木呀
发布时间: 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的异同
    • 共用内存地址
    • union所占内存空间大小

结构体

什么是结构体?

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

定义结构体

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走的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 5.6.10 32_安装mysql-5.6.10-win32 解压版-略有修改

1.复制mysql-5.6.10-win32.zip到D:\app目录下.2.解压mysql-5.6.10-win32.zip3.在D:\app\mysql-5.6.10-win32下&#xff0c;复制“my-default.ini”文件&#xff0c;生成“复件 my-default.ini”文件。将“复件 my-default.ini”文件重命名成“my.ini” 。(注意&#xff1a;如果…

培养自信,笑赢未来

注&#xff1a;本文是儿子幼儿园小班第一个月中&#xff0c;老师要求每个学生家长都要交的命题作文。要求基于当前典型的421家庭中&#xff0c;如何培养孩子的自信心成文。为此&#xff0c;我作为家长第一次向老师提交了这篇作文。自信心对一个人的健康成长至关重要&#xff0c…

mysql中当前时间九点_MySQL 获得当前日期时间(以及时间的转换)

1.1 获得当前日期时间(date time)函数&#xff1a;now()除了 now() 函数能获得当前的日期时间外&#xff0c;MySQL 中还有下面的函数&#xff1a;current_timestamp() current_timestamplocaltime() localtimelocaltimestamp() localtimestamp这些日期时间函数&#xff0c;都等…

STM32串口原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据

参考&#xff1a;串口的结构体 重定向printf串口发送stm32等博文 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-06 21:46:33 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114458698 目录串口相关知识定义通信概念1.通讯结构2.电平标准3…

mysql kvdb_从MYSQL到KVDB

2016年4月10日 星期日 阴&#xff0c;雾霾惊悉新浪SAE又多收费了&#xff0c;凡是用Mysql的应用&#xff0c;每天至少要交22448颗云豆的租金。新浪为什么经常干这种事呢&#xff1f;用户会不会怀疑哪天又开始另找名目多收云豆&#xff1f;这跟食堂打菜员给人打菜一样&#xff0…

STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

参考&#xff1a;stm32定时器与定时器中断 作者&#xff1a;打酱油的 发布时间&#xff1a; 2021-04-11 01:04:09 网址&#xff1a;https://blog.csdn.net/weixin_46098612/article/details/115493737 参考&#xff1a;stm32通用定时器结构体函数定时器实现led闪烁 作者&#x…

关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。

关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。 楼主在公司接手了一段代码。编译的时候发现一个很奇怪的问题&#xff0c;就是获取最新代码的时候能编译通过&#xff0c;然后下次就编译不通过了&#xff0c;提示如下错误。 后来发现问题出在std…

返回json数据

拦截器的配置&#xff0c;导致只能返回boolean类型的数据&#xff0c;那么要让前端知道在哪里被拦截了&#xff0c;拦截了什么&#xff0c;这就要用到json数据&#xff0c;返回相应的数据,package com.sysh.web.interceptor;/** * Created by sjy Cotter on 2018/7/24. */impor…

STM32端口复用和端口重映射

参考&#xff1a;stm32 端口复用和重映射 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-09 13:49:19 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114581032 目录端口复用1.什么是端口复用2. 如何配置端口复用(以PA9、PA10串口为例)端口…

Scala学习:Curry化的函数

2019独角兽企业重金招聘Python工程师标准>>> 在第1章&#xff0c;我们说过Scala允许你创建新的“感觉像是原生语言支持”的控制抽象。尽管到目前你已经看到的例子都的确是控制抽象&#xff0c;不过任何人都不会 误以为它们是原生语言支持的。为了搞明白如何让控制抽…

js 获取session_Python实战案例:这是你见过的最详细的JS加密登录某博

0x00 抓包分析简单的搜索之后发现&#xff0c;很多参数都是登陆上面这个请求返回的值&#xff0c;这个请求在输入完账号光标到达密码框时就会生成!0x01 加密逻辑分析搜索su可以很快找到加密的位置&#xff0c;上图看到e.su和e.sp都是由sinaSSOEncoder这个函数生成的&#xff0c…

Maven镜像源

Maven仓库镜像 修改Maven setting.xml文件 在 标签内添加以下镜像。 注意&#xff1a;如果构建错误&#xff0c;请根据错误信息&#xff0c;调整镜像位置 <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable …

STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

参考&#xff1a;stm32 定时器输出PWM原理及工作原理控制舵机 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-09 23:17:52 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114606662 参考&#xff1a;stm32之pwm输出 作者&#xff1a;打酱油…

nzhtl1477-ただいま帰りました ( bfs )

nzhtl1477-ただいま帰りました 题目描述 珂学题意&#xff1a; 你是威廉&#xff01;你要做黄油蛋糕给珂朵莉吃~&#xff01; 68号岛有n个商店&#xff0c;有的商店直接有小路连接&#xff0c;小路的长度都为1 格里克告诉了你哪些地方可能有做黄油蛋糕的原料 但是那个人是个坑货…

STM32系统定时器SysTick(只能向下递减)延时闪烁灯

参考&#xff1a;stm32 系统定时器 SysTick 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-10 13:46:00 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114633245 参考&#xff1a;stm32之系统定时器 作者&#xff1a;打酱油的&#xff1b…

WMS学习笔记:1.尝试加载WMS

1.首先找一个可用的WMS栅格地图服务&#xff1a;http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi 获取GetCapabilities&#xff1a; http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?serviceWMS&requestGetCapabilities 2.在ArcGIS中添加GIS空间服务 2.在ArcC…

python后缀名切割_python批量将.xls转化为.xlsx,包括文件名和后缀分割

import osimport pandas as pd#此方法用将xls转化为xlsxdef transformat():global path #定义为全局变量path os.getcwd()#获取当前工作路径file os.listdir(path)#获取当前路径下的所有文件for f in file:file_name_be,suff os.path.splitext(f)#对路径进行分割&#xff0c…

005.LVM删除

一 删除LVM步骤 卸载挂载点移除LV移除VG移除PV删除配置文件二 卸载挂载点 1 [rootkauai ~]# umount /dev/vg01/lv01 #先卸载挂载点 三 移除LV 1 [rootkauai ~]# lvremove /dev/vg01/lv01 #移除lv2 Do you really want to remove active logical volume lv01? [y/n]: y3 …

判断CPU是大端还是小端

#include "stdafx.h" #include <iostream> using namespace std;/* #大端模式&#xff08;Big_endian&#xff09;&#xff1a;字数据的高字节存储在低地址中&#xff0c;而字数据的低字节则存放在高地址中。 #小端模式&#xff08;Little_endian&#xff09;&…

mysqli 扩展_MySQLi的优势

1. 功能增加了2&#xff0c;效率大大增加(以后的PHP项目改成mysqli)3&#xff0c;更稳定mysqli使用面向对象技术&#xff0c;但也支持过程化的使用方式mysqli扩展中给我提供了三个类&#xff1a;1. mysqli和连接有关的类2. mysqli_result表达了对数据库的查询所返回的结果集。 …