和小白一起学数据结构三之c与结构及联合

2023-05-16

和小白一起学数据结构(三)

今天博主动笔有些晚了哈,所以不讲太多废话了,直接上干货!

今天我们来复习c语言提供的两种聚合数据类型(aggregate data type):数组和结构,其中之一“结构”。今天的第一个复习问题来了,什么是聚合数据类型?聚合数据类型,顾名思义就是将具有某一共同属性的数据通过特定方式或者结构结合起来,简言之,就是能够同时存储超过一个的单独数据。当然我们接下来就要先复习结构了。

第二个问题,那联合又是什么奇怪的动物呢?欲知究竟,请往下读~

一、结构

我们先来设想一个下面这样的场景,新生入学报道填表,每个新生都要在舍管阿姨那张表里填上自己的学号、姓名、房号、手机号和专业班级。
c语言提供两种聚合数据类型,数组和结构。数组是形状大小完全相同的格子组成,即类型完全相同的元素集合,它的每一个元素都是可以通过下标引用或者指针间接访问来选择的。结构和数组不同,它存储的每个元素就像新生入学表里每个人的学号和姓名一样是各不相同的数据类型,它的这些值称为成员(mumber),结构里各成员的长度不同所以不能通过下标访问,需要通过它们的名字访问它们。

a.声明一个结构

我们现在来动手声明一个结构:

struct tag { mumber-list } variable-list; //声明结构时,我们必须要列出这个结构包含所有成员的列表,列表包括每个成员的类型和名字

下面是几个栗子?:

struct  sample  { 
                   int   a;
                   float   b;
                   char   c;
} x ;
...
struct  sample  { 
                   int   a;
                   float   b;
                   char   c;
} y[20], *z;

以上声明创建了一个名叫x的变量,一个含有20个元素名叫y的数组变量,一个指向结构变量的指针。我们可以看到上面两结构完全相同,但在c语言里,以上这种情况下面出现这种赋值就是非法的

z=&x;

为什么?因为在上面的结构声明中虽然两个sample都包含一个名为a的整型,一个名为b的浮点型,一个名为c的字符型,但它在计算机眼里是完全不同的两个结构变量,好比现实生活中的双胞胎一样。那怎样处理上述情况呢?

struct sample {
                int a;
                float b;
                char c
 };
struct sample x;
struct sample y[20],*z;
z=&x;//此时该语句合法

b.结构成员的直接访问

我们用点操作符直接访问结构变量的成员,点操作符接受两个操作数。我们再声明一个更复杂的结构:

struct complex{
               int   a[20];
               long  *p;
               struct sample sa[10];
               struct sample s;
               struct sample *sp;
  }com;

现在我们看下面几个栗子?:

表达解释
com.a[1]com结构中成员数组a中的第二个元素
(com.sa)[3]com结构中名为sa的结构数组成员中第四个元素
com.s.acom结构中名为s结构成员中的a成员
(com.sa)[4].bcom结构中名为sa结构数组成员的第五个元素结构中的b浮点数

c.结构成员的间接访问

说到间接访问第一个就要想到指针,我们还是看上面的com栗子。我们令:

(*sp).b=3.14;

则如何用外部指针间接访问结构中的成员呢?c语言为我们提供了一个更为方便的操作符)—— “箭头操作符(->)”。如何使用呢?

p->b;//即可,注意箭头操作符的优先级非常高

下面我们来做一个有意思的改动?:

sp->a=0;

把a赋值为0,所以(*sp).a的值与sp->a的有值相同都为零。现在我们来玩一个有意思的魔法,好了一起来,准备好你们的魔法棒,变!
*sp->a,这里的间接访问符作用与a存储内容代表的指针值,而a本身的内容为0,即为null空指针,所以它不会指向任何东西。对一个null指针进行解引操作是个错误,但正如我们昨天讨论的一样,有些环境运行时,机器根本不会捕捉到这个错误。

二、联合

打好所有基础才不怕数据结构这个大龙哦~加油!加油!继续努力?!

a.声明一个联合

联合和结构类似,但行为方式和结构不同。联合中所有成员引用的是内存中相同的位置。先让我们看一个简单的例子。

union {
           float f;
           int i;
  }fi;

在一个int和float都为32位的机子上,变量fi只占32位,如果变量中的浮点型被引用,这个字就做为浮点型访问,当然也可以通过其他形式打印出来,比如下面这个操作:

fi.f=3.14;
printf("%d\n",fi.i);

把圆周率的浮点表示存储于fi,然后把这些相同的位当作整形值打印输出。

b.联合的初始化

联合变量可以被初始化,这个初始化变量必须是联合第一个成员的类型,而且必须位于花括号内。 举例?:

union {
           int f;
           float i;
           char a[10];
  } x = { 5 };

即把x.f初始化为5.

今天就到这里,关于位段、结构的存储分配、作为函数的参数的结构等内容,循序渐进,在之后的数据结构里马上会出现~以上,明天见!(昨天愣是没过审,生气,再发亿遍!)

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

和小白一起学数据结构三之c与结构及联合 的相关文章

  • 嵌入式物联网【数据处理篇】C 语言char类型与int类型的转化

    char和int的转换有两种方式 这两种方式适合于在输出时使用 最简单的方法就是利用ASSCII码的差值 直接用char的值减去 0 就行了 eg char nbsp a nbsp 9 int nbsp a a 0 另一个就是要利用c语言的
  • QT数据库:在QT中多线程访问mysql数据库的问题(已解决)

    一 可以便捷的使用多线程并发类QtConcurrent解决 关于类的使用请参考博客 便捷的使用多线程并发类QtConcurrent解决Qt在槽函数中执行耗时操作导致界面卡住的问题 吻等离子的博客 CSDN博客 二 出现问题 QT使用全局db
  • RS485、RS232、TTL的电平以及数据的收发

    目录 一 RS232 1 RS232标准接口定义 2 RS232串口线颜色定义 3 RS232串口接线方法 4 RS232的电平 二 RS485 xff08 基于MAX85的收发介绍 xff09 1 RS485标准接口定义 2 RS485串
  • 软件使用:如何彻底把VMware卸载干净

    1 禁用VM虚拟机服务 首先 xff0c 需要停止虚拟机VMware相关服务 按下快捷键WIN 43 R xff0c 打开windows运行对话框 xff0c 输入services msc 点击确定 在服务管理中 xff0c 找到VM开头的
  • Qt编译器MinGW和MSVC的区别

    一 两者的区别 1 MSVC 即Microsoft Visual C Compiler 即微软自己的编译器 我们下载Windows下的OpenCV时 解压后里面有两个文件夹 一个是build 一个是source build这个文件夹实际上是
  • Visual Studio快捷键(超全)

    目录 常用 xff1a 一 文件相关 二 编辑搜索相关 三 导航视图相关 四 项目相关 五 生成相关 六 调试相关 七 调试相关 八 分析相关 九 工具相关 十 扩展相关 十一 窗口相关 十二 帮助相关 常用 xff1a ctrl 43 x
  • 【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)

    一 安装与汉化 对版本没要求的可以直接选择 3 免安装的汉化包 1 下载安装MarkText MaxText win64 https github com marktext marktext releases download v0 17
  • 嵌入式【协议篇】CAN协议原理

    nbsp 一 CAN协议介绍 1 简介 CAN是控制器局域网络 Controller Area Network CAN 的简称 是一种能够实现分布式实时控制的串行通信网络 其实可以简单把CAN通信理解成开一场电话会议 当一个人讲话时其他人就
  • 曲阜师范大学831学姐高分背诵笔记(完整版)

    导论部分 1 微格教学 18 名词解释 答 微格教学称为 微型教学 xff0c 也称为 小型教学 所谓 微格教学 xff0c 就是将复杂的教学过程分解成许多容易掌握的具体的单一的技能 xff0c 如 导读技能 34 讲授技能 提问技能 等
  • STM32 【FreeRTOS HAL库】创建任务

    任务也不是很复杂的东西 简单得说 创建一个任务 你得提供它的执行函数 你得提供它的栈的大小 函数的执行空间 函数的优先级等重要的条件 因为任务在运行中 任务函数有调用关系 有局部变量 这些都保存在任务的栈里面 任务有可能被切换 有可能被暂停
  • 函数实现是否应该放在头文件

  • Microsoft Visual Studio C++2022 Windows 11 SDK环境

    Microsoft Visual Studio C 43 43 2022 Windows 11 SDK环境 1 安装2 环境变量本文为作者 难拳 原创 xff0c 转载请注明出处 1 安装 Visual Studio 2022适用于Wind
  • 【原创】浅谈指针(十)链表的写法

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 前言 最近我又
  • AB实现双方通信

    题目要求 xff1a 通过C语言编写一个程序 xff0c 程序中需要有两个进程 xff0c 假设这两个进程是A和B xff0c 通过这两个进程模拟一个类似QQ聊天的情景 xff0c A进程和B进程分别代表通话一方 xff0c A进程能够发消
  • 串口传图显示

    串口传图 使用串口通信协议传输一张图像到SDRAM存储后VGA协议显示到屏幕 工程设计 图片生成 使用小梅哥资源中的Picture2Hex软件生成任意分辨率的图片 xff08 我这里选择640 480 xff09 matlab将得到合适分辨
  • Intel Realsense L515 ros节点时间戳不同步解决方法

    问题描述 在使用Intel Realsense L515的ros程序的时候 xff0c 会出现 frame 39 s span class token function time span domain is HARDWARE CLOCK
  • 宏定义(无参宏定义和带参宏定义)

    宏定义是比较常用的预处理指令 xff0c 即使用 标识符 来表示 替换列表 中的内容 标识符称为宏名 xff0c 在预处理过程中 xff0c 预处理器会把源程序中所有宏名 xff0c 替换成宏定义中替换列表中的内容 常见的宏定义有两种 xf
  • B6(B6AC)充电器中文简要说明书

    B6 xff08 B6AC xff09 充电器中文简要说明书 首先 xff0c 感谢模友们使用深圳比优德的B6充电器 深圳比优德动力产品技术有限公司致力于为全国模友提供最高性价比的动力产品 xff0c 公司所有产品均自主研发与自主生产 ww
  • c++STL库详细用法

    目录 1 什么是STL xff1f 2 STL内容介绍 2 1 容器 2 2 STL迭代器 2 3 算法 2 4 仿函数 2 4 1 概述 2 4 2 仿函数 functor 在编程语言中的应用 2 4 3 仿函数在STL中的定义 2 5
  • C语言之结构体对齐

    本次让我们来一起学习一下C语言中我们该如何将结构体内存对齐呢 xff1f 什么是结构体 xff1f span class token keyword struct span span class token class name A spa

随机推荐

  • STM32串口中断接收

    本次是结合项目 xff0c 来总结下在stm32CubeIDE开发环境下关于串口接收数据问题 xff1b 项目背景 xff1a 利用MODBUS通讯协议 串口中断的流程为 xff1a 1 在main c文件中对串口进行初始化操作 MX US
  • ORB-SLAM 学习笔记

    ORB SLAM 基本介绍 ORB SLAM 是西班牙 Zaragoza 大学的 Ra l Mur Arta 编写的视觉 SLAM 系统 它是一个完整的 SLAM 系统 xff0c 包括视觉里程计 跟踪 回环检测 xff0c 是一种完全基于
  • OCR(Optical Character Recognition,光学字符识别)问题

    应用场景 xff1a 在这个过程中由于场景的不确定性 xff0c 比如 xff1a 图片背景极其丰富 亮度不均衡 光照不均衡 残缺遮挡 文字扭曲 字体多样等等问题 xff0c 会带来极大的挑战 自然场景中文本具有多样性 xff1a 文本检测
  • OCR-文本检测方法

    基于回归的文本检测 基于回归文本检测方法和目标检测算法的方法相似 xff0c 文本检测方法只有两个类别 xff0c 图像中的文本视为待检测的目标 xff0c 其余部分视为背景 水平文本检测 早期基于深度学习的文本检测算法是从目标检测的方法改
  • C++中使用__FUNCTION__ ,__TIME__ ,__LINE__ ,__FILE__这几个宏的解释

    FUNCTION xff0c 34 TIME 34 xff0c LINE xff0c FILE 这几个宏是编译器自带的 xff0c 不是那个头文件定义的 FUNCION xff1a 函数名 TIME xff1a 文件运行的时间 LINE x
  • UART串口通信协议详解

    UART xff1a 通信异步收发器 xff0c 串行 异步通信总线 xff0c 两条数据线 xff08 收发 xff09 xff0c 全双工 xff08 可以同时接收和发送 xff09 一 UART帧格式 xff08 UART协议 xff
  • 基于FPGA的DDS信号发生器

    之前的博客讲到了DDS的基本原理 xff0c 现在用Verilog代码实现DDS 能够产生四种波形 xff0c 方波 xff0c 三角波 xff0c 正弦波 xff0c 锯齿波 xff0c 用按键来控制频率和选择波形 其中按键消抖模块来自小
  • C++的命名空间详解

    c 43 43 命名空间详解 命名空间的意义命名空间的定义命名空间的使用 命名空间的意义 在C C 43 43 中 xff0c 变量 函数和后面要学到的类都是大量存在的 xff0c 这些变量 函数和类的名称将都存在于全局作用域中 xff0c
  • 基于Verilog的32位并行进位加法器设计

    1 功能概述 xff1a 先行进位加法器是对普通的全加器进行改良而设计成的并行加法器 xff0c 主要是针对普通全加器串联时互相进位产生的延迟进行了改良 超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的 设二进制加法器第i位
  • 基于verilog的处理器设计之寄存器堆

    该寄存器堆是CPU中多个寄存器组成的阵列 xff0c 由32个32位的寄存器构成 xff0c 两个读数据口 Ra gt BusA Rb gt BusB 一个写数据口 Rw gt BusW 写数据受使能信号Wen控制 xff0c 在时钟的下降
  • 使用结构体方式访问寄存器的实践

    朱老师单片机课程学习记录 span class token macro property span class token directive keyword ifndef span GPIO H span span class token
  • MIM,MOM和MOS电容的区别

    ic layout经常会遇到这三种电容 xff1a MOS xff0c MOM xff0c MIM MOS 电容 xff1a 两端结构的mos管 xff0c 电容值不精确 xff0c 可以实现随控制电压变化而变 化的容值 xff0c 上下极
  • 折叠共源共栅放大器Cadence仿真

    仿真原理图如下 xff0c 图中M4的宽长比应该和M5一样 xff0c 为4u 150n m nf为1 2 M8和M9的宽长比为4u 500n 完整的电路图如下 xff1a cascode晶体管的L给小一点 xff0c 电流镜晶体管L给大一
  • 二级运放的Cadence仿真

    基于之前做的折叠共源共栅cascode xff0c 在后面加两个管子 xff0c 变成一个简单的二级运放 二级运放的通带内的增益大于80dB xff0c GBW为大于50M xff0c 相位裕度大于60 为了保证运放的相位裕度 xff0c
  • 射频接收机的参数计算

  • 户外系统原理方框图

  • bandgap中简并点理解与仿真

    综合EETOP论坛上的解答以及自己的仿真 xff0c 一般来说一个电路有可能存在一个以上满足KCL KVL电路方程的解 工作点 这些解中有的是稳定解 有的可能是非稳定解 其区别在于 如果电路目前工作在稳定解 当出现扰动时 比如实际电路中的噪
  • GPS卫星定位基本原理

    GPS定位基本原理 GPS测量定位方法分类 定位模式 xff1a 绝对定位 xff08 单点定位 xff09 相对定位 差分定位 定位时接收机天线的运动状态 xff1a 静态定位 xff0d 天线相对于地固坐标系静止 动态定位 xff0d
  • c++缺省参数,函数重载详解

    c 43 43 缺省参数 xff0c 函数重载详解 缺省参数什么是缺省参数 xff1f 缺省参数的分类 1 全缺省参数 2 半缺省参数 规则 xff1a 缺省参数只能从右往左 xff0c 依次给出 xff08 这是规定 xff09 函数重载
  • 和小白一起学数据结构三之c与结构及联合

    和小白一起学数据结构 xff08 三 xff09 今天博主动笔有些晚了哈 xff0c 所以不讲太多废话了 xff0c 直接上干货 xff01 今天我们来复习c语言提供的两种聚合数据类型 xff08 aggregate data type 数