当前位置: 首页 > news >正文

C语言结构体和位段

自定义类型:结构体及联合和枚举

  • 一.结构体类型的声明
    • 1.1 结构体的概念
    • 1.2结构的声明
    • 1.3特殊的声明
    • 1.4结构体的自引用
    • 1.5可以使用typedef重命名
  • 二.结构体变量的创建和初始化
    • 2.1结构体变量的初始化使用`{}`
    • 2.2初始化:定义变量的同时赋初值。
    • 2.3结构体嵌套及初始化
  • 三.结构体成员访问操作符
  • 四.结构体内存对齐
    • 4.1对齐规则
      • 练习1
      • 练习2
      • 练习3
      • 练习4(嵌套结构体的对齐数)
    • 4.2修改默认对齐数
  • 五.结构体传参
  • 六.联合体
    • 6.1联合体类型的声明
    • 6.2联合体的特点
    • 6.2计算联合体的大小
    • 6.3用联合体判断大小端字节序
  • 七.枚举类型
    • 7.1枚举类型的声明
    • 7.2枚举的优点
    • 7.3 枚举类型的使用

一.结构体类型的声明

1.1 结构体的概念

结构是一些值的集合,这些称为成员变量,结构的每个成员可以是不同类型的变量

1.2结构的声明

struct tag
{member-list;
}variable-list;

假如是一个大学生,可以用以下带代码描述

struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号}; 

这里注意结构体后面的分号是不可以丢的

1.3特殊的声明

在声明结构体的时候可以使用匿名结构体
但是匿名结构体只可以使用一次

//匿名结构体类型
struct
{int a;char b;float c;
}x;
struct
{int a;char b;float c;
}a[20], *p;

编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。
匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。

1.4结构体的自引用

在结构中包含⼀个类型为该结构本⾝的成员是可以的
比如:定义一个链表结点

struct Node
{int data;struct Node* next;
};

1.5可以使用typedef重命名

typedef struct Node
{int data;struct Node* next;
}Node;

二.结构体变量的创建和初始化

2.1结构体变量的初始化使用{}

struct Point
{int x;int y;
}s1; //声明类型的同时定义变量s1
struct Point s2; //定义结构体变量s2

2.2初始化:定义变量的同时赋初值。

struct Point p3 = {x, y};

2.3结构体嵌套及初始化

struct Node
{int data;struct Point p;struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};struct Stu
{char name[15];int age;
};
struct Stu s = {.age=20, .name="zhangsan"};//初始化

三.结构体成员访问操作符

结构成员访问操作符有两个⼀个是 . ,⼀个是 -> .

有以下两种方式:
结构体变量.成员变量名
结构体指针—>成员变量名

struct student
{char name[10];int age;
};int main()
{struct student stu = { "zhangsan",10 };struct student* pstu = &stu;printf("%d", (*(pstu)).age);printf("%d",pstu->age);return 0;
}

四.结构体内存对齐

4.1对齐规则

1. 结构体的第一个成员相对于结构体变量起始位置偏移量为0的地址处
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍地址
3. 结构体总大小为 最大对其数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍
4. 如果要是嵌套了结构体的情况,嵌套的结构体成员对齐到自己成员中的最大对其数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍

以下有几个练习:

练习1

计算下列结构体大小:

struct S1
{char c1;char c2;int i;
};
printf("%d\n", sizeof(struct S1));

结果是在这里插入图片描述

下面画图来解释以下原因:
在这里插入图片描述

练习2

计算下列结构体大小:

struct S2
{char c1;int i;char c2;
};
int main()
{printf("%d\n", sizeof(struct S2));return 0;
}

结果是在这里插入图片描述

下面画图来解释以下原因
在这里插入图片描述
因为对齐数要是最大对齐数的整数倍,所以就是12

练习3

struct S3
{double d;char c;int i;
};
int main()
{printf("%d\n", sizeof(struct S3));return 0;
}

运行结果是在这里插入图片描述

下面画图来解释以下原因:
在这里插入图片描述

练习4(嵌套结构体的对齐数)

struct S3
{double d;char c;int i;
};struct S4
{char c1;struct S3 s3;double d;
};
int main()
{printf("%d\n", sizeof(struct S4));return 0;
}

运行结果在这里插入图片描述

下面画图来解释以下原因:
在这里插入图片描述

4.2修改默认对齐数

可以使用#pragam pack(1),设置默认对齐数为1
pragam pack()取消设置默认对齐数

五.结构体传参

struct S
{int data[1000];int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}
int main()
{print1(s); //传结构体print2(&s); //传地址return 0;
}

六.联合体

6.1联合体类型的声明

联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体
给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

//联合类型的声明
union Un
{char c;int i;
};
int main()
{//联合变量的定义union Un un = {0};//计算连个变量的⼤⼩printf("%d\n", sizeof(un));return 0;
}

运行结果:

4

6.2联合体的特点

联合的成员是共用同⼀块内存空间的,这样⼀个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

代码

#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;
}

输出结果:

001AF85C
001AF85C
001AF85C

6.2计算联合体的大小

联合的大小至少是最⼤成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

代码:

union Un1
{char c[5];int i;
};
union Un2
{short c[7];int i;
};
int main()
{//下⾯输出的结果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}

运行结果:
在这里插入图片描述

下面画图来解释以下原因:
在这里插入图片描述

因为Un1的char c[5]需要占用5个字节,5不是4的倍数,所以就是8个字节
Un2的char c[7]要占用14个字节,但是14不是结构第默认对齐数的最小公倍数,所以就是16

6.3用联合体判断大小端字节序

int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;
}

七.枚举类型

7.1枚举类型的声明

enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
enum Sex//性别
{MALE,FEMALE,SECRET
}enum Color//颜⾊
{RED,GREEN,BLUE
};

1. 以上定义的 enum Day , enum Sex ,enum Color 都是枚举类型。
2. {}中的内容是枚举类型的可能取值,也叫 枚举常量 。
3. 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color//颜⾊
{RED=2,GREEN=4,BLUE=8
};

7.2枚举的优点

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使用方便,一次可以定义多个常量
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

7.3 枚举类型的使用

enum Color//颜⾊
{RED=1,GREEN=2,BLUE=4
};
enum Color clr = GREEN;

在C语言中是可以的,但是在C++是不行的,C++的类型(语法)检查比较严格。

文章到这里结束了!!!如果有错,请立刻指正,谢谢!!!

相关文章:

C语言结构体和位段

自定义类型&#xff1a;结构体及联合和枚举 一.结构体类型的声明1.1 结构体的概念1.2结构的声明1.3特殊的声明1.4结构体的自引用1.5可以使用typedef重命名 二.结构体变量的创建和初始化2.1结构体变量的初始化使用{}2.2初始化&#xff1a;定义变量的同时赋初值。2.3结构体嵌套及…...

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、剑指offer每日一练 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️寻找文件副本(题目难度&#xff1a;简单)1.1 题目1.2 示例1.3 限制1.4 解题思路一c代…...

Python核心编程之文件和输入输出

目录 一、文件对象 二、 文件内建函数[open()和file()] 1、工厂函数 file() 2、通用换行符支持(UNS)...

Axure 9基本元件,表单及表格元件简介,表单案例

目录 一.基本元件 1.元件基本介绍 2.基本元件的使用 二.表单及表格元件 三.表单案例 四.简单简历绘制 一.基本元件 1.元件基本介绍 概述 - 在Axure RP中&#xff0c;元件是**构建原型图的基础模块**。 将元件从元件库里拖拽到画布中&#xff0c;即可添加元件到你的原型…...

ARM I2C通信

1.概念 I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工同步总线&#xff0c;主要用于连接整体电路2.IIC总线硬件连接 1.IIC总线支持多主机多从机&#xff0c;但是在实际开发过程中&#xff0c;大多数采用单主机多从机模式 2.挂接到IIC总线上&#xff0c;每个从机设备都…...

Cent OS7 磁盘挂载:扩展存储空间和自动挂载

文章目录 &#xff08;1&#xff09;概述&#xff08;2&#xff09;查看磁盘使用情况&#xff08;3&#xff09;VMware虚拟机挂载磁盘&#xff08;4&#xff09;物理机磁盘挂载&#xff08;5&#xff09;ntfs硬盘处理 &#xff08;1&#xff09;概述 在Linux系统中&#xff0c…...

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤&#xff0c;我们现在就可以开发我们的项目开发了&#xff0c;根据项目开发的需要…...

SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析

. # &#x1f4d1;前言 本文主要是SpringBoot进行自然语言处理&#xff0c;利用Hanlp进行文本情感分析&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风…...

MySQL 报错 You can‘t specify target table for update in FROM clause解决办法

You can’t specify target table for update in FROM clause 其含义是&#xff1a;不能在同一表中查询的数据作为同一表的更新数 单独执行复合查询是正常的&#xff0c;如下&#xff1a; 但是当执行子查询删除命令时&#xff0c;报如下错误 DELETE FROM abpusers WHERE Id I…...

Linux中使用podman管理容器

本章主要介绍使用podman管理容器 了解什么是容器&#xff0c;容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像数据卷的使用管理容器的命令使用普通用户管理容器 对于初学者来说&#xff0c;不太容易理解什么是容器&#xff0c;这里…...

飞天使-linux操作的一些技巧与知识点3-http的工作原理

文章目录 http工作原理nginx的正向代理和反向代理的区别一个小技巧dig 命令巧用 http工作原理 http1.0 协议 使用的是短连接&#xff0c;建立一次tcp连接&#xff0c;发起一次http的请求&#xff0c;结束&#xff0c;tcp断开 http1.1 协议使用的是长连接&#xff0c;建立一次tc…...

微搭低代码实现登录注册功能

目录 1 创建用户数据源2 实现登录逻辑3 搭建登录页面4 设置登录框5 实现登录的逻辑6 用户注册总结 原来产品在创建应用的时候可以创建模型应用&#xff0c;模型应用对应我们小程序的后端。最新的更新已经将模型应用的能力下线&#xff0c;那我们不得不自己实现一下后端的逻辑。…...

使用Cobalt Srike制作钓鱼文件

钓鱼 钓鱼文件是一种常见的网络攻击手段&#xff0c;旨在欺骗用户&#xff0c;诱使他们点击恶意链接、下载恶意附件或提供敏感信息。钓鱼文件的概念是通过伪装成合法、可信的文件或链接来欺骗受害者&#xff0c;使其相信文件或链接的来源是可信的&#xff0c;从而促使他们采取…...

任意文件读取漏洞

使用方法php://filter/readconvert.base64-encode/resourcexxx 任意文件读取漏洞 php://filter/readconvert.base64-encode/resourceflag 在url后边接上 以base64的编码形式 读取flag里面的内容 php://filter/readconvert.base64encode/resourceflag 用kali来解码 创建一个文…...

一个文件下png,jpg,jpeg,bmp,xml,json,txt文件名称排序命名

#utf-8 #authors 会飞的渔WZH #time:2023-12-13 import os# 要修改的图像所在的文件夹路径 root_path rD:\images\lines2\3 # 要修改的图像所在的文件夹路径filelist os.listdir(root_path) #遍历文件夹 print(len(filelist)) i0for item in filelist:if item.endswith(.…...

phpstudy小皮(PHP集成环境)下载及使用

下载 https://www.xp.cn/download.html直接官网下载即可&#xff0c;下载完解压是个.exe程序&#xff0c;直接点击安装就可以&#xff0c;它会自动在D盘目录为D:\phpstudy_pro 使用 phpMyAdmin是集成的数据库可视化&#xff0c;这里需要下载一下&#xff0c;在软件管理-》网站程…...

[BUG记录]UART占用CPUload过高问题

目录 关键词平台说明一、背景二、根本原因三、措施 关键词 嵌入式、C语言、autosar、TDA4 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、背景 在基于TDA4开发的域控中使用到了UART打印debug信息&#xff0c;不…...

Flutter常用命令

一、环境安装 flutter --version 查看当前安装的flutter 版本 flutter upgrade 升级当前的flutter 版本 flutter doctor 检查环境安装是否完成 二、项目编译运行 flutter clean 清空build目录 flutter pub get 获取pub插件包 flutter run --设备名称 运行项目到指定设…...

【C++】POCO学习总结(十四):引用计数、共享指针、缓冲区管理

【C】郭老二博文之&#xff1a;C目录 1、Poco::AutoPtr 智能指针 1.1 说明 Poco::AutoPtr是一个含有引用计数的“智能”指针模版。 Poco::AutoPtr用于支持引用计数的类实例化。支持引用计数的类需要有以下要求&#xff1a; 维护一个引用计数(在创建时初始化为1)实现void du…...

Python之禅

import this 这是 Python 社区中著名的 "The Zen of Python"&#xff08;Python之禅&#xff09;文档&#xff0c;由 Python 创始人之一的 Tim Peters 撰写。这个文档包含了一系列关于编程和代码设计哲学的原则&#xff0c;以指导 Python 社区的开发者。以下是这些原…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...