基础知识 - 结构体
1、结构体类型与结构体变量
1.1 结构体的定义
结构体是一种自定义的数据类型,它把多个不同类型的变量封装在一起,形成一个新的复合数据类型。可以定义该结构体类型的变量,与使用 int 定义变量的方法相同
结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
如:标量,指针,数组,甚至是其他结构体
1.2 结构体的创建
使用 struct 关键字创建结构体
例如,在描述一个学生信息时,我们可能需要姓名(字符串)、年龄(整数)、成绩(浮点数)等不同类型的数据,这时就可以定义一个结构体来整合这些信息:
struct Student
{char name[50]; //姓名int age; //年龄float grade; //成绩
}; //分号不能丢
1.3 结构体变量声明与初始化
定义结构体后,就可以声明该类型的变量。有多种方式可以声明结构体变量,并且可以在声明时进行初始化:
C 和 C++ 中结构体的区别:
C 环境下:struct + 标号名 才表示结构体类型(可以使用 typedef 起别名)
#include<stdio.h>//typedef - 起别名 //格式:typedef 类型名 别名typedef struct Student //定义一个学生结构体,并给结构体起别名为Stu {int num;char sex; }Stu;int main() {typedef int i; //给int起别名为ii m = 7;Stu a; //通过别名定义结构体类型变量return 0; }
C++ 环境下:结构体名就可以表示结构体的类型
#include<iostream> using namespace std;struct Student //定义一个学生结构体 {int num;char sex; };int main() {Student a; //通过结构体名定义结构体类型的变量return 0; }
本文代码使用 C 语言格式
// 单个结构体变量并初始化
struct Student student1 = {"Alice", 20, 85.5};// 结构体数组并初始化
struct Student class[3] =
{{"Bob", 21, 78.0},{"Charlie", 20, 90.0},{"David", 22, 88.5}
};
1.4 结构体的成员访问
- 结构体变量,可以使用点运算符(.)来访问其成员
例如,要输出student1的年龄,可以这样写:
printf("Student age: %d\n", student1.age);
- 如果结构体变量是指针类型,则需要使用箭头运算符(->)来访问成员
例如:我们有一个指向Student结构体的指针ptrStudent,要输出ptrStudent的名字,可以这样写:
struct Student *ptrStudent = &student1;
printf("Student name: %f\n", ptrStudent->name);
2、结构体字节对齐
2.1 对齐规则
- 找成员当中最大的类型来作为对齐数,因此结果一定是它的整数倍
- 要按照成员变量定义的顺序进行,不能自由组合分配空间
- 按照整数倍地址对齐
2.2 带有位域的对齐规则
位域:
- 成员:之后的数字
- 表示的是所占 bit 的大小
- 在内存要求苛刻的情况下可以使用位域。在不同系统(不同编译器也不同)不同效果(不要在可移植代码中使用)
- 分析相邻的两个成员是否是同种类型,如果是同种类型,可以考虑放置在同一个单位下
- 如果相邻的成员超出一个单位,那么就放两个单位里面,放置的时候不允许跨单位存储
2.3 带有指针的对齐规则
只与当前运行环境有关(默认 x86 运行环境)
- x86 - 32bit - 4字节
- x64 - 64bit - 8字节
typedef struct s1
{char a; //1int b; //4short c; //2
}s1;typedef struct s2
{char a : 1; //1 1bitint b : 5; //4 5bitchar* c; //4 (默认x86运行环境)short d; //2
}s2;typedef struct s3
{s1* a; //4 (默认x86运行环境)s2 b; //4 16 (s2的对齐数为4字节,s2的总字节数为16)char c; //1long d; //4
}s3;int main()
{printf("%d,%d,%d", sizeof(s1), sizeof(s2), sizeof(s3));//输出: 12 16 28return 0;
}
2.4 常用数据类型的字节数
数据类型 | 字节数 |
int | 4 |
char | 1 |
long | 8 |
short | 2 |
float | 4 |
double | 8 |
习题
1、求 sizeof(s) ( )
struct s
{
int x: 3;
int y: 4;
int z: 5;
double a;
}
A: 16
B: 32
C: 20
D: 24
解析:2*8=16
成员当中最大的类型为 double,所以以 8 字节作为对齐数。前3个是同种类型且没有超出一个单位,可以考虑放置在同一个单位下,故 2 * 8
2、在 32 位 cpu 上选择缺省对齐的情况下,有如下结构体定义则 sizeof(struct A) 的值为 ( )
struct A {
unsigned a : 19;
unsigned b : 11;
unsigned c : 4;
unsigned d : 29;
char index;
A: 9
B: 12
C: 16
D: 20
解析:4*4=16
成员当中最大的类型为 int,所以以 4 字节作为对齐数。前 4 个都是同种类型,可以考虑放置在同一个单位下,由于相邻成员超出一个单位就要放两个单位里面,故前 2 个放在一个单位里,第 3 个放在一个单位里,第 4 个放在一个单位里,故 4 * 4
3、结构体的自引用
3.1 结构体中直接包含同类型结构体变量不可行
struct Node
{int data;struct Node next;
};
这种定义是错误的。原因在于,如果一个结构体里包含同类型的结构体变量,会陷入无限嵌套的情况。假设要计算 sizeof(struct Node),为了确定 struct Node 的大小,就得先知道 next 成员的大小,而 next 又是 struct Node 类型,它里面又有 next 成员,如此循环往复,结构体大小就会无穷大,这显然是不合理的,编译器也无法为其分配确定大小的内存空间
3.2 结构体中包含同类型结构体指针是可行的
struct Node
{int data;struct Node* next;
};
这是正确的结构体自引用方式。因为指针在内存中占用固定大小的空间(在 32 位系统中通常是 4 字节,在 64 位系统中通常是 8 字节),不管 struct Node 具体是什么样子,struct Node* 类型的指针只是用来存储另一个 struct Node 结构体实例的地址,所以不会出现无限嵌套导致大小无法确定的问题
在这种情况下,计算 sizeof(struct Node) 就很明确了。假设 int 类型占 4 字节,指针在 32 位系统占 4 字节,那么 sizeof(struct Node) 的结果就是 4 + 4 = 8 字节;在 64 位系统中,如果指针占 8 字节,sizeof(struct Node) 就是 4 + 8 = 12 字节 (不考虑字节对齐的情况下)
3.3 关于 typedef 对匿名结构体类型重命名时的错误
typedef struct
{int data;Node* next;
}Node;
这里是错误的。typedef 的作用是给前面的匿名结构体类型取一个新名字 Node,但在匿名结构体内部却提前使用了 Node 这个还未定义完成的类型来创建 next 成员变量。在编译器处理到 Node* next; 这一行时,Node 还没有被定义,所以编译器无法识别 Node 类型,从而导致编译错误
3.4 正确的 typedef 重命名方式
typedef struct Node
{int data;struct Node* next;
}Node;
这种方式是正确的。首先,定义了一个名为 struct Node 的结构体,在结构体内部使用 struct Node* 来引用自身类型的指针,这是合法的。然后,使用 typedef 把 struct Node 类型重命名为 Node,这样之后就可以直接使用 Node 来声明变量了,例如:Node node1;
综上所述,结构体自引用时要使用指针,在使用 typedef 重命名结构体类型时要注意类型定义和使用的先后顺序,避免出现编译错误。
相关文章:
基础知识 - 结构体
1、结构体类型与结构体变量 1.1 结构体的定义 结构体是一种自定义的数据类型,它把多个不同类型的变量封装在一起,形成一个新的复合数据类型。可以定义该结构体类型的变量,与使用 int 定义变量的方法相同 结构体是一些值的集合,这…...
uniapp上传图片时(可选微信头像、相册、拍照)
参考文献:微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…...
2025年4月16日华为笔试第二题200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 智慧旅游路线规划 问题描述 LYA正在开发一款智慧旅游APP,该APP需要为游客规划城市景点之间的最佳路线。城市有 N N...
面试题之高频面试题
最近开始面试了,410面试了一家公司 针对自己薄弱的面试题库,深入了解下,也应付下面试。在这里先祝愿大家在现有公司好好沉淀,定位好自己的目标,在自己的领域上发光发热,在自己想要的领域上(技术…...
一路磕磕绊绊解决flutter doctor 报错CocoaPods not installed
flutter doctor执行之后,出现以下错误: 错误消息: ✗ CocoaPods not installed.CocoaPods is a package manager for iOS or macOS platform code.Without CocoaPods, plugins will not work on iOS or macOS.For more info, see https://flutter.dev/t…...
探寻Gson解析遇到不存在键值时引发的Kotlin的空指针异常的原因
文章目录 一、问题背景二、问题原因三、问题探析Kotlin空指针校验Gson.fromJson(String json, Class<T> classOfT)TypeTokenGson.fromJson(JsonReader reader, TypeToken<T> typeOfT)TypeAdapter 和 TypeAdapterFactoryReflectiveTypeAdapterFactoryRecordAdapter …...
面试算法高频08-动态规划-01
动态规划 递归知识要点 递归代码模板:提供递归代码的标准形式public void recur(int level, int param) ,包含终止条件(if (level> MAX_LEVEL))、当前层逻辑处理(process(level, param))、向下一层递归…...
【AI】以Llama模型为例学习如何进行LLM模型微调
以Llama模型为例学习如何进行LLM模型微调 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 以Llama模型为例学习如何进行LLM模型微调背景预训练微调全部微调参数高效微调低秩适配 (LoR…...
细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法
目录 一、函数vTaskList() 1、 函数说明 2、返回的字符串表格说明 3、函数的使用方法 二、 vTaskList()的应用示例 1、示例功能、项目设置 2、软件设计 (1)main.c (2)freertos.c (3)FreeRTOSConf…...
ffmpeg 添加 nvenc支持
运行以下命令检查当前 FFmpeg 是否支持 hevc_nvenc: ffmpeg -hide_banner -encoders | grep nvenc 若输出包含 hevc_nvenc,说明编码器已集成,问题出在驱动或参数配置若无输出,则需要手动编译 ffmpeg 安装显卡驱动、cuda和cudnn…...
锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》
锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》 先看结果:价格展示 https://atemplate.com/pricing 旧的打折价格展示 新的打折价格展示 锚定效应是什么? 人类在进行决策时,会过度偏重先前取得的资讯(这称为锚点&…...
红宝书第四十九讲:XSS/CSRF攻击防御策略解析
红宝书第四十九讲:XSS/CSRF攻击防御策略解析 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 XSS(跨站脚本):黑客把恶意代码塞进网页,当你打开页面时&am…...
Unity基于屏幕空间的鼠标拖动,拖动物体旋转
代码的核心在于,鼠标的屏幕偏移映射到物体的旋转角度,代码中是使用射线去检测的,检测帧间隔鼠标的位置对应物体上的旋转 未解决的问题:旋转都是相对的,怎么去处理,鼠标拖动物体,物体不动&#…...
Unity3D 测试驱动开发(TDD)框架设计
前言 针对Unity3D测试驱动开发(TDD)框架的设计,需要结合Unity引擎特性与TDD核心原则,构建可维护、高效且与开发流程深度集成的测试体系。以下是分层次的框架设计方案: 对惹,这里有一个游戏开发交流小组&a…...
Google Mock(GMock):C++单元测试的高效模拟框架详解
标题: Google Mock(GMock):C单元测试的高效模拟框架详解 摘要: Google Mock(GMock)是C单元测试中的核心工具,能够高效隔离外部依赖并验证复杂交互逻辑。本文详细介绍了GMock的核心…...
智慧城市气象中台架构:多源天气API网关聚合方案
在开发与天气相关的应用时,获取准确的天气信息是一个关键需求。万维易源提供的“天气预报查询”API为开发者提供了一个高效、便捷的工具,可以通过简单的接口调用查询全国范围内的天气信息。本文将详细介绍如何使用该API,以及其核心功能和调用…...
vue3项目启动bug
项目场景: vue3 项目启动运行 问题描述 终端无法正常启动运行 C:/user/adminC:/user/admin> npm run dev > student_status_vue30.0.0 dev > vite原因分析: 暂无 解决方案: 在当前项目目录下运行: npx vite --host…...
逻辑回归 (Logistic Regression)
文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源(1)从概率模型推导而来(统计学习视角)(…...
SLAM | 激光SLAM中的退化问题
在激光SLAM中,判断退化环境的核心是通过数学建模分析环境特征对位姿估计的约束能力。除了LOAM中提出的退化因子D外,还存在多种基于表达式和阈值设定的方法。以下是几种典型方法及其实现原理: 1. 协方差矩阵特征值分析 原理:通过分析点云协方差矩阵的特征值分布,判断环境中…...
【已更新】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题
完整内容请看文末最后的推广群 先展示问题一代码和结果、再给出四个问题详细的模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib.font_manager import FontPropertiesfrom matplotlib import rcParams# 设…...
[特殊字符] 基于大模型的地理领域文档中英互译自动化方案
一、📌 项目背景与挑战 在全球化商业环境中,跨国企业经常面临专业文档翻译的痛点: 传统方式效率低下:专业文档翻译需要专人耗时数小时甚至数天 专业术语准确性难保证:地理领域术语的特殊性 格式保持困难:…...
破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战
在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…...
高度图(Heightmap)
高度图的数学组成与建模方法 高度图(Heightmap)是一种基于规则网格的地形表示方法,其数学本质是将三维地形简化为二维离散函数,通过高度值的存储和插值实现地形重建。以下从数学建模角度系统阐述其组成原理及关键技术。 一、基础…...
2025第十七届“华中杯”大学生数学建模挑战赛题目B 题 校园共享单车的调度与维护问题完整思路 模型 代码 结果分享
共享单车目前已成为不少大学校园内学生的重要通勤工具,给学生的出行带来了极大便利,但同时也产生了一些问题,如共享单车投放点位设计不合理,高峰期运力不足等。 某高校委托一公司在校园内投放了一批共享单车,经过一段时…...
ESP32-idf学习(一)搭建环境和点灯
一、前言 先说一下查到的数据(不保证准确): 1、连续四年Wi-Fi MCU全球市场份额第一,产品应用于智能家居、工业自动化、医疗健康等泛IoT领域,2024 年营收突破 20 亿元(同比 40%),…...
超详细VMware虚拟机扩容磁盘容量-无坑版
1.环境: 虚拟机:VMware Workstation 17 Pro-17.5.2 Linux系统:Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 (1)在虚拟机关机的状态下,虚拟机硬盘扩容之前必…...
多线程(进阶续~)(内涵面试题)
目录 一、JUC 的常见类 1. Callable 接口 2. ReentrantLock ReentrantLock 的用法: ReentrantLock 和 synchronized 的区别: 何时使用何锁: 3. 原子类 4. 线程池 ExecutorService 和 Executors ThreadPoolExecutor 5. 信号量 Semaphore 6. C…...
OpenGL shader开发实战学习笔记:第十一章 立方体贴图和天空盒
1. 立方体贴图和天空盒 1.1. 什么是立方体贴图 立方体贴图(Cube Map)是一种纹理,它由六个纹理图像组成,每个纹理图像对应一个方向。这些方向通常是立方体的六个面,分别是“前面”,“后面”,“…...
双指针算法(二)
目录 一、力扣611——有效三角形的个数 二、牛客网3734——和为S的两个数字 三、力扣15——三数之和 四、力扣18——四数之和 一、力扣611——有效三角形的个数 题目如下: 这里我们先认识如何判断是个三角形,ab>c,ac>b,bc>a即为三角形 这里…...
docker Windows 存放位置
docker Windows 存放位置 镜像文件层可能是这 docker的overlay2中存的都是什么and如何清理/var/lib/docker/overlay2_docker overlay 是什么目录-CSDN博客 存的是我们的镜像文件和容器内的文件 \\wsl.localhost\docker-desktop\mnt\docker-desktop-disk\data\docker\overla…...
每日一题(小白)暴力娱乐篇31
首先分析一下题意,需要求出2024的因子,因为我们要求与2024互质的数字,为什么呢?因为我们要求互质说直白点就是我和你两个人没有中间人,我们是自然而然认识的,那我们怎么认识呢,就是直接见面对吧…...
FastAPI与SQLAlchemy数据库集成
title: FastAPI与SQLAlchemy数据库集成 date: 2025/04/17 15:33:34 updated: 2025/04/17 15:33:34 author: cmdragon excerpt: FastAPI与SQLAlchemy的集成通过创建虚拟环境、安装依赖、配置数据库连接、定义数据模型和实现路由来完成。核心模块包括数据库引擎、会话工厂和声…...
SQL刷题记录贴
1.题目:现在运营想要对用户的年龄分布开展分析,在分析时想要剔除没有获取到年龄的用户,请你取出所有年龄值不为空的用户的设备ID,性别,年龄,学校的信息。 错误:select device_id,gender,age,un…...
消息队列实际结点数与计数器不一致问题分析
问题描述 协议栈 PDCP线程任根据外部消息,维护一个链表式的PDCP PDU消息队列,以及一个变量count来记录消息队列中结点数。 当收到 从NG接口业务数据时,PDCP线程会向PDCP PDU消息队列中添加大量节点,消息队列的count值相应的增加…...
AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月17日第55弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀6-8个和值,可以做到100-300注左右。 (1)定…...
C++23 新特性:std::size_t 字面量后缀 Z/z
在 C23 中,引入了一个非常实用的新特性:为 std::size_t 类型的字面量提供了新的后缀 Z 和 z。这一改进使得在代码中声明和使用 std::size_t 类型的字面量变得更加直观和便捷。 1. 背景与动机 在之前的 C 标准中,std::size_t 是一种非常常用…...
【裁员感想】
裁员感想 今天忽然感觉很emo 因为知道公司要裁员 年中百分之10 年末百分十10 我知道这个百分20会打到自己 所以还挺不开心的 我就想起 我的一个亲戚当了大学老师 我觉得真的挺好的 又有寒暑假 又不是很累 薪资也不低 又是编制 同时也觉得自己很失败 因为对自己互联网的工作又…...
CSS例子 > 图片瀑布流布局(vue2)
<template><div class"container"><!-- 临时容器用于计算高度 --><div v-if"!isLayoutReady" class"temp-container"><divv-for"(item, index) in list":key"temp- index":ref"(el) > …...
Python 获取淘宝券后价接口的详细指南
在电商领域,淘宝作为国内领先的电商平台,提供了丰富的商品和优惠活动。对于开发者来说,获取淘宝商品的券后价是一个极具价值的功能,可以帮助用户更好地进行购物决策,同时也为相关应用和服务提供了数据支持。本文将详细…...
零服务器免备案!用Gitee代理+GitHub Pages搭建个人博客:绕过443端口封锁实战记录
#GitHub Pages #Gitee代理 #SSH密钥管理 #Jekyll博客 #网络穿透 场景:自己的电脑没有添加github的ssh代理,只有gitee的代理 实现效果,在公网可以运行个人博客。在本地更改内容后公网同步更新。 最开始的模板 最终实现的博客模板࿱…...
如何新建一个空分支(不继承 master 或任何提交)
一、需求分析: 在 Git 中,我们通常通过 git branch 来新建分支,这些分支默认都会继承当前所在分支的提交记录。但有时候我们希望新建一个“完全干净”的分支 —— 没有任何提交,不继承 master 或任何已有内容,这该怎么…...
[终极版]Javascript面试全解
this指向 执行上下文 是代码执行时的运行环境作用域 是变量和函数的可访问性规则(静态);全局、函数和块状;内层可访问外层,外层不能访问内层词法环境 是实现作用域的引擎内部机制(静态) 执行上…...
day30图像处理OpenCV
文章目录 一、图像预处理9. 图像掩膜9.1 制作掩膜9.2 与运算1.原理2.语法 9.3 颜色替换9.4案例 一、图像预处理 9. 图像掩膜 创建的掩膜方便我们对目标区域进行操作。 9.1 制作掩膜 掩膜通常是一个二值化图像,并且与原图像的大小相同。其中目标区域被设置为1&am…...
蓝桥杯 10.拉马车
拉马车 原题目链接 题目描述 小时候你玩过纸牌游戏吗? 有一种叫做 “拉马车” 的游戏,规则简单但非常吸引小朋友。 游戏规则简述如下: 假设参加游戏的小朋友是 A 和 B,游戏开始时,他们得到的随机纸牌序列如下&am…...
Java学习总结-Junit单元测试
单元测试: 就是针对最小功能的单元:方法,编写测试代码对其进行正确性测试。 之前我们怎么测试的:在main方法中调用其他方法,一个方法测试失败可能导致其他方法得不到测试,无法得到测试报告。 Junit单元测…...
代理IP:城市文化IP打造的隐形加速器
目录 一、解码代理IP:数字时代的"变身术" 1.1 工作原理探秘 1.2 主要类型对比 二、城市文化IP的打造密码 2.1 核心要素拆解 2.2 成功案例启示 三、代理IP的五大赋能场景 3.1 文化数据采集 3.2 目标市场定位 3.3 品牌传播突破 3.4 版权保护监控 …...
链式数据存储系统
目录 系统说明 服务端的模块设计 存储数据说明 服务端设计-程序入口(main) 数据库的连接-mysql包的编写 数据的加密-hash文件的编写 数据传递格式-proto文件的编写 具体实现方法-controller包的编写 日志的打印-logs包的编写 扩展服务端 系统说…...
《理解 Java 泛型中的通配符:extends 与 super 的使用场景》
大家好呀!👋 今天我们要聊一个让很多Java初学者头疼的话题——泛型通配符。别担心,我会用最通俗易懂的方式,带你彻底搞懂这个看似复杂的概念。准备好了吗?Let’s go! 🚀 一、为什么我们需要泛型通配符&…...
Scala 入门指南
Scala 入门指南 目录 简介环境搭建基础语法面向对象编程函数式编程集合模式匹配特质隐式转换并发编程与 Java 互操作最佳实践常见问题 简介 Scala 是一种多范式编程语言,结合了面向对象编程和函数式编程的特性。它运行在 JVM 上,与 Java 完全兼容&am…...
GESP2025年3月认证C++八级( 第一部分选择题(11-15))
杨辉三角形: #include <iostream> using namespace std;#define N 35 // 最多支持输出 35 行 int a[N]; // 一维数组,用于存储当前行的杨辉三角数int main() {int n;cin >> n; // 输入要输出的行数for (int i 0; i < n; i) {a[i] …...