结构体+联合体 详解

2023-05-16

文章目录

  • 一、结构体
    • 1.结构体变量
    • 2.特殊声明
    • 3.结构体的引用
      • 1.嵌套调用
      • 2.自引用
  • 三、结构体的初始化
  • 四、结构体的内存对齐
    • 1.用法
    • 2.练习题
    • 3.修改对齐数
  • 五、位段
    • 1.用法
    • 2.练习题
  • 六、联合体
    • 1.用法
    • 2.练习题
      • 1.正常算法题
      • 2.用联合体判断大小端

一、结构体

1.结构体变量

struct s
{
  char name[20];
  int age;
}p1,p2;
int main()
{
  struct s p3;
  return 0;
}

p1,p2,p3都是结构体变量
但由于p1,p2在main外部定义 是全局变量
p3是局部变量

2.特殊声明

声明的时候 不完全声明 为匿名结构体类型
注意匿名结构体类型只能使用一次

#include<stdio.h>
struct 
{
  char name[20];
  int age;
};

3.结构体的引用

1.嵌套调用

通过调用 pa变量 返回到stdent结构体中

#include<stdio.h>
struct student
{
  char name[20];
  int age;
  char sex[20];
};
struct teacher
{
  char name[20];
  int age;
   struct student pa;
   char sex[20];
};

2.自引用

(1)无法做到自己调用自己 会无限套娃

#include<stdio.h>
 struct S
 {
   char name[20];
   int age;
   struct S pa;//err
 };
 int main()
 {
  struct S s;
  return 0;
 }

(2)若是想做到用本身类型访问下一个同类型结构体
使用指针指向下一个要访问的结构体

#include<stdio.h>
struct s
{
 int age;
 struct s*nest;
};
 

三、结构体的初始化

这里的初始化很简单
就举一个嵌套调用的例子

#include<stdio.h>
struct student
{
 char name[20];
 int age;
 char sex[20];
};
struct teacher
{
 char name[20];
 int age;
 struct student s;
 char sex[20];
};
int main()
{
 struct teacher p={"张三","35"{"王五","16","男"},"男"};
 printf("%s %d %s %d %s %s\n",p.name,p.age,p.s.name,p.s.age,p.s.sex,
        p.sex};
  return 0;
 }

四、结构体的内存对齐

1.用法

1.第一个结构体成员放在 0偏移量处
2.若放在VS中 默认对齐数是8
后面的结构体成员 用其字节与默认对齐数比较 取小的为该结构体成员的对齐数 结构体成员放在对齐数整数倍的地址处
3. 结构体的大小 是所有成员最大对齐数的整数倍

2.练习题

#include<stdio.h>
 struct s
 {
  char a;
  int b;
  char c;
 };
 int main()
 {
  struct s pa;
  printf("%d\n",sizeof(pa));
  return 0;
 }

VS中默认对齐数是8
char a为1个字节 1<8 即a的对齐数是1
int b为4个字节 4<8 即b的对齐数是4
char c为1个字节 1<8 即c的对齐数是1
正常来说应取9个字节 9没有达到最大对齐数4的整数倍
故 要取 12
在这里插入图片描述

#include<stdio.h>
struct s2
{
 char c1;
 char c2;
 int i;
}
int main()
{
 strcut s2 S;
 printf("%d\n",sizeof(S));
 return 0;
}

char c1为1个字节 1<8 即c1的对齐数是1
char c2为1个字节 1<8 即c2的对齐数是1
int i为4个字节 4<8 即i的对齐数是4
最大对齐数为4 因为最后也是取 8 是4的整数倍
即 8
在这里插入图片描述

3.修改对齐数

#include<stdio.h>
#pragma pack(2) //将默认对齐数修改成2
struct s
{
 char a;
 int b;
 char c;
}
#pragma pack() //将修改的对齐数消除 即只在上面的结构体生效
int main()
{
 struct s pa={0};
 printf("%d\n",sizeof(pa));
 return 0;
}

需要注意的是 对齐数是结构体成员在哪里进行偏转
偏转的大小是字节数
修改后 默认对齐数为2
char a为1个字节 1<2 即a的对齐数为1
int b为4个字节 4>2 即b的对齐数为 2
char c为 1个字节 1<2 即c的对齐数为1
最大对齐数为 2
但是结构最后是 7 不是2的整数倍 最后为 8
在这里插入图片描述

五、位段

1.用法

位段的成员必须是 int , unsigned int, signed int
成员名后必须有 冒号和数字
位段的空间是按照 int或者 char来开辟的
我们通常将 位段成员 按照 低比特位到高比特位传递
如果一块空间剩下的内容不够下一个成员使用 这块空间就会被浪费掉

2.练习题

#include<stdio.h>
struct S
{
   char _a:3;//a占两个比特位
   char_b:4;//b占4个比特位
   char_c:5;//c占5个比特位
   char_d:4;//d占4个比特位
}
struct S s={0};
s.a=10;
s.b=12;
s.c=3;
s.d=4;

a为 10 -------- 1010--------->占3个比特位—010
b为 12 -------- 1100--------->占4个比特位—1100
c为 5 --------- 00101--------> 占5个比特位–00101
d为 4 ---------- 0010------------>占4个比特位—0010
在这里插入图片描述

六、联合体

1.用法

1. 一种特殊的自定义类型,主要表现为 成员共用一块空间
  1. 联合体的计算
    联合体的大小至少是最大的成员的大小
    当最大成员大小不是最大对齐数的整数时 就要对齐到最大对齐数的整数

2.练习题

1.正常算法题

VS默认对齐数为8
int a为4个字节, 4<8, a的对齐数为4
char b为1个字节 1<8 b的对齐数为1
a与b共用第一块空间 所以为4
又因为 4时是 最大对齐数4的整数倍 即 4

 #include<stdio.h>
 union un
 {
   int a;
   char b;
 }
 int main()
 {
  union un pa;
  printf("%d\n",sizeof(pa));//4
  return 0;
 }

在这里插入图片描述

2.用联合体判断大小端

#include<stdio.h>
 int move()
 {
   union un
   {
     int a;
     char b;
   }u;
   u.a=1;
    return u.b;
  int main()
  {
    int ret=move();
    if(ret==1)
    {
     printf("小端\n");
    }
    else
    {
     printf("大端\n");
    }
    return 0;
 }
     
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体+联合体 详解 的相关文章

随机推荐

  • 小四轴调试记录

    从准备理论到实际动手调试大约耗时半年吧 xff0c 期间看了很多理论知识 xff0c 惯性导航方面的文章 至于为什么选择从小四轴入手 xff0c 当时的理由很简单 xff1a 1 便宜 xff0c 2 空心杯电机虽然有刷会坏但便宜 xff0
  • 登录 账号密码验证

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta http equiv 61 34 X U
  • 关于C++变量重复定义

    本人是刚入学的大一计算机类学生 xff0c 最近在学习C 43 43 xff0c 在回顾这个代码时候发现 xff0c 这个重复定义i和j会导致之前定义的全局变量i和j并不能起作用 xff0c 现在还不太清楚为什么 xff0c 请小伙伴们注意
  • OpenMV——色块识别

    OpenMV有很多示例代码 xff0c 下面是我学习过程中有关知识的总结 目录 前言 一 阈值选择 二 代码 前言 函数RGB 255 0 0 表示的是红色 RGB 255 0 0 含义 xff1a 红色值 Red 61 255 xff1b
  • 链表的概念以及相关基础操作

    前言 xff1a 链表是数据结构里面最开始的章节 xff0c 也是对新手的理解有困难的第一章 笔者大二下学校才开设数据结构 xff0c 以防自己忘记 xff0c 遂记录之 链表的概念 xff1a 链表是一种物理存储单元上非连续 非顺序的存储
  • Sqoop数据导入 第2关:Mysql导入数据至HDFS上

    为了完成本关任务 你需要掌握 1 数据库 MySQL 建表 2 Mysql 数据导入至 HDFS 中 数据库 MySQL 建表 用命令进入 MySQL 客户端 mysql uroot p123123 h127 0 0 1 创建数据库hdfs
  • 一、单链表创建以及操作

    链表操作全内容 xff1a 1 xff0c 链表创建 2 xff0c 创建头结点 xff08 赋值 xff09 3 xff0c 输出当前链表 4 xff0c 连接节点形成链表 5 xff0c 插入节点函数 6 xff0c 删除节点函数 7
  • STL常用的容器

    STL常用容器 目录 STL常用容器vector容器pair c 43 43 内置二元组 不需要头文件stringqueue 队列priority queue 优先队列stack 栈deque 双端队列 速度异常的慢set map mult
  • Ubuntu网页连接失败的解决方法

    问题如下 xff1a 一 首先你要先检查自己的Ubuntu是否能连接上网络 二 在确保自己能连接上网络时 xff0c 网页连接失败的原因可能是你的Firefox浏览器的默认搜索引擎时Google xff0c 只需要在网页设置 搜索 中将搜索
  • Hal库_stm32开发之串口IDLE空闲中断+DMA接收不定长数据并修改数据

    本文写自于博主编写平衡智能车程序的时候 xff0c 由于中断使用的较多 xff0c 如定时器中断 xff0c 串口中断等等 为了避免MCU运行程序时卡死 xff0c 我就将串口中断改为串口IDLE空闲接收中断 可以实现不定长数据的接收 xf
  • PCB学习(一)——立创EDA边框设置

    一 伴随原理图转PCB生成的边框 通过在 原理图界面 点击 设计 下的 原理图转PCB xff08 Alt 43 P xff09 xff0c 可以得到如下 矩形边框 二 PCB界面设置边框 在 PCB界面 点击 工具 下的 边框设置 xff
  • c++模板类/模板函数的声明与定义应该放在头文件里

    c 43 43 模板类 模板函数的声明与定义应该放在头文件里 xff0c 不要分开来写类中函数的声明与定义 xff08 比如在 H文件里声明某个成员函数 xff0c 在 CPP文件里定义该成员函数 xff09 xff0c 这样会导致连接错误
  • STM32的GPIO端口配置八种模式的理解

    文章目录 一 GPIO的结构框图二 八种模式1 模拟输入 xff08 GPIO Mode AIN xff09 2 浮空输入 xff08 GPIO Mode IN FLOATING xff09 3 上拉输入 xff08 GPIO Mode I
  • ESP32 micro-usb 多数据量并简单加密的串口通信

    文章目录 前言一 ESP32和上位机的环境二 上位机部分1 串口通信的准备2 数据的准备与发送 三 下位机部分1 ESP32串口通信准备2 数据的接收四 同时测试 总结 前言 最近在研究单片机与上位机的串口通信 xff0c 刚好手头有一块E
  • boost之跨平台 错误处理

    system C 43 43 中处理错误的最佳方式是使用异常 xff0c 但操作系统和许多底层AP工不具有这个能力 xff0c 它们一般使用更通用也更难以操作的错误代码来表示出错的原因 xff0c 不同的操作系统的错误代码通常不是兼容的 x
  • 记录一下vector基本用法(简单易懂)

    vector容器的初始化 vector的使用首先需要加一个头文件 include lt vector gt xff1b vector lt int gt a 最一般的初始化方法 xff0c 就是定义一个容器啊a xff1b vector l
  • MPU6050基本原理介绍及程序配置

    一 MPU6050简介 1 内部主要结构 xff1a 陀螺仪 加速度计 数字运动处理器DMP xff08 Digital Motion Processor xff09 PS MPU6050还含有第二IIC接口 xff0c 用于连接一个 第三
  • Robomaster上位机视觉摘要——比赛规则篇

    本文是笔者多日来总结的2023赛季中针对上位机组的比赛规则摘要 xff0c 力求一文让你看懂上位机在赛场中的飒爽身影 目录 电力元件 电池 遥控器 激光 涂装 机器人 飞镖 雷达 空中机器人 工程机器人 哨兵机器人 英雄与步兵机器人 视觉应
  • C语言:结构体——关于内存字节对齐图文详解

    前言 xff1a 我们在学到c语言内存管理的时候总是一遍惊叹 xff0c 其聪明的内存管理策略 xff0c 一遍抱怨其难以理解的方法 xff0c 网上的资料要不讲究的太详细 xff0c 要不没能讲解清楚 xff0c 今天我们根据实例来学习一
  • 结构体+联合体 详解

    文章目录 一 结构体1 结构体变量2 特殊声明3 结构体的引用1 嵌套调用2 自引用 三 结构体的初始化四 结构体的内存对齐1 用法2 练习题3 修改对齐数 五 位段1 用法2 练习题 六 联合体1 用法2 练习题1 正常算法题2 用联合体