结构体笔记

结构体
C语言中的数据类型:
基本数据类型:char/int/short/double/float/long
构造数据类型:数组,指针,结构体,共用体,枚举
概念:
结构体是用户自定义的一种数据类型,可以是相同的数据类型,也可以是不同的数据类型的集合
格式:
struct 结构名
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
数据类型 成员4;
......
数据类型 成员n;
}; //结尾的";"不可省略
*分析:
struct:是结构体的关键字
结构名:满足命名规范
{}:不能省略
数据类型:可以是基本数据类型,也可以是构造数据类型
成员:可以是任意个成员
结构体的声明可以在任意位置,但一般在头文件中
结构体在声明类型时不占用内存空间,当使用结构体类型定义变量时申请空间
结构体的初始化和赋值
间接初始化和赋值
格式:
struct 结构名
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
数据类型 成员4;
......
数据类型 成员n;
};
struct 结构名 变量={数据类型 成员1,...,数据类型 成员n} //按顺序初始化
struct 结构名 变量={.成员1=,...,.成员n=} //不按顺序初始化(用". 成员"+成员对应的数据类型的数据)
输出结构体(结构体变量访问内部成员,通过"."访问)
printf("占位符\n",变量.成员1,变量.成员2,...)
间接初始化练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student
{char name[128];int age;double score;
}; int main(int argc, const char *argv[])
{struct student s1={"张三",24,98};struct student s2={"李四",36,87};struct student s3={"王五",18,43};printf("姓名:%s年龄:%d成绩%lf\n",s1.name,s1.age,s1.score);printf("姓名:%s年龄:%d成绩%lf\n",s2.name,s2.age,s2.score);printf("姓名:%s年龄:%d成绩%lf\n",s3.name,s3.age,s3.score);return 0;
}
间接赋值练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;double score;
};
int main(int argc, const char *argv[])
{//间接初始化 struct student s1={"张三",24,98};struct student s2={"李四",36,87};struct student s3={"王五",18,43}; printf("姓名:%s年龄:%d成绩%lf\n",s1.name,s1.age,s1.score);printf("姓名:%s年龄:%d成绩%lf\n",s2.name,s2.age,s2.score);printf("姓名:%s年龄:%d成绩%lf\n",s3.name,s3.age,s3.score);//赋值方式1struct student s4;strcpy(s4.name,"牛二");s4.age=25;s4.score=67;printf("姓名:%s年龄:%d成绩%lf\n",s4.name,s4.age,s4.score);//赋值方式2struct student s5;printf("输入学生姓名\n");scanf("%s",s5.name);printf("输入学生年龄\n");scanf("%d",&s5.age);printf("输入学生成绩\n");scanf("%lf",&s5.score);printf("姓名:%s年龄:%d成绩%lf\n",s5.name,s5.age,s5.score);return 0;
}
直接初始化和赋值
直接初始化是将变量定义在结构体类型的后面
如果使用直接初始化,可以省略结构名不写
如果省略结构名,则只能使用已有的结构类型变量
格式:
struct 结构名
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
数据类型 成员4;
......
数据类型 成员n;
}
变量1={.成员1=,...,.成员n=},
变量2={.成员1=,...,.成员n=},
变量3={.成员1=,...,.成员n=}
...
;
练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct dog
{char name[128];int age;char color[128];
}d1={.name="小黑",.age=2,.color="白色"},d2={.name="小白",.age=2,.color="黑色"},d3,d4;
void out(struct dog d)
{printf("名字:%s年龄:%d毛色:%s\n",d.name,d.age,d.color);
}
int main(int argc, const char *argv[])
{out(d1);out(d2);//赋值方式1struct dog d3;strcpy(d3.name,"小黄");d3.age=25;strcpy(d3.color,"黄色");out(d3);//赋值方式2struct dog d4;printf("输入姓名\n");scanf("%s",d4.name);printf("输入年龄\n");scanf("%d",&d4.age);printf("输入毛色\n");scanf("%s",d4.color);out(d4);return 0;
}
结构体数组
数组:一次性定义多个类型相同的变量
结构体数组:一次性定义多个类型相同的结构体变量
结构体数组的初始化和赋值
间接初始化和赋值

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;int id;
};
void out(struct student *s,int n)
{for(int i=0;i<n;i++){printf("名字:%s 年龄:%d 学号:%d\n",s[i].name,s[i].age,s[i].id);}
}
int main(int argc, const char *argv[])
{struct student s[3]={{"张三",18,1008},{"李四",18,1009}}; //按顺序初始化struct student s1[3]={[2]={.id=1009,.name="王五",.age=20}}; //不按数据初始化out(s,3);out(s1,3);return 0;
}
直接初始化和赋值

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;int id;
}
s[3]={{"张三",23,1010}}
;
void out(struct student *s,int n)
{ for(int i=0;i<n;i++){ printf("名字:%s 年龄:%d 学号:%d\n",s[i].name,s[i].age,s[i].id);}
}
void in(struct student *s,int n)
{for(int i=0;i<n;i++){printf("输入姓名\n");scanf("%s",s[i].name);printf("输入年龄\n");scanf("%d",&s[i].age);printf("输入学号\n");scanf("%d",&s[i].id);}}
int main(int argc, const char *argv[])
{ out(s,3);return 0;
}
结构体指针
结构体指针:存储结构体变量的地址
格式:
struct 结构名 *变量名;
结构指针访问内部变量通过"->"访问
练习:
在栈区中用结构体指针实现结构体元素的输入输出
在堆区中用结构体指针实现结构体元素的输入输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;int id;
};
void out(struct student *s,int n)
{for(int i=0;i<n;i++){printf("名字:%s 年龄:%d 学号:%d\n",(s+i)->name,(s+i)->age,(s+i)->id);}
}
void in(struct student *s,int n)
{for(int i=0;i<n;i++){printf("输入姓名\n");scanf("%s",(s+i)->name);printf("输入年龄\n");scanf("%d",&(s+i)->age);printf("输入学号\n");scanf("%d",&(s+i)->id);}}
int main(int argc, const char *argv[])
{struct student s[3];struct student *p=s;in(p,3);out(p,3); struct student *str=(struct student *)malloc(sizeof(struct student)*3);struct student *q=str;in(q,3);out(q,3);return 0;
}
typedef结合结构体
格式:
typedef 直接修饰结构体类型(常用)
typedef struct student
{
int id;
int age;
}stu;
stu s; ---> struct student s
typedef 间接修饰结构体类型
struct student
{
int id;
int age;
};
typedef struct student stu;
stu s; ---> struct student s
typedef 起多个名字
typedef struct student
{
int id;
int age;
}student,*ptr_student;
student s; ---> struct student s
ptr_student p=$s; ---> struct student *p
结构体的嵌套
格式:
typedef struct birthday
{
int year;
int month;
}bir;
typedef struct student
{
char name[128];
int age;
bir b; //嵌套一个结构体
}stu;
stu s = {18,"11",2003,12,12};
结构体的嵌套结构体数组
格式:
typedef struct car
{
double price;
char name[128];
}car;
typedef struct student
{
char name[128];
int age;
car b[3]; //嵌套一个结构体数组
}stu;
stu s = {18,"11",{1,"名字"},{2,"名字"},{3,"名字"}};
结构体字节对齐(字节计算 笔试)
结构体各个成员的地址是连续的
结构体变量的地址是第一个成员的地址
64位操作系统,8字节对齐:
- 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
- 结构体的首地址是最宽成员的倍数
- 结构体各个成员的首地址是该成员字节的整数倍,否则填充空字节
32位操作系统,4字节对齐:
- 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
- 结构体的首地址是最宽成员的倍数
- 结构体各个成员的首地址是该成员字节(或该成员字节数大于4则是4)的整数倍,否则填充空字节
共用体
概念:不同或者相同的数据,共用一段内存空间
作用:实现一段内存,存放不同的数据
格式:
union 共用名
{
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
数据类型 成员4;
......
数据类型 成员n;
}; //结尾的";"不可省略
*分析:
union:是结构体的关键字
共用名:满足命名规范
{}:不能省略
数据类型:可以是基本数据类型,也可以是构造数据类型
成员:可以是任意个成员
共用体的声明可以在任意位置,但一般在头文件中
共用体在声明类型时不占用内存空间,当使用共用体类型定义变量时申请空间
共用体的内存空间是最宽成员的内存大小
相关文章:
结构体笔记
结构体 C语言中的数据类型: 基本数据类型:char/int/short/double/float/long 构造数据类型:数组,指针,结构体,共用体,枚举 概念: 结构体是用户自定义的一种数据类型,…...
Elasticsearch:Golang ECS 日志记录 - zerolog
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。在本教程中,我将详述如何 编码器以 JSON 格式记录日志,并以 ECS 错误格式处理错误字段的记录。 默认情况下,会添加以下字段&…...
Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用
文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…...
研发管理革命:探索顶尖的工时系统选择
国内外主流的10款研发工时管理系统对比:PingCode、Worktile、无鱼项目工时系统、Toggl Track、泽众ALM、Asana、Jira、GitHub、Trello、TrackingTime。 在研发团队中,工时管理常常成为效率瓶颈,尤其是在资源分配和项目进度跟踪方面。选择合适…...
微服务-MybatisPlus下
微服务-MybatisPlus下 文章目录 微服务-MybatisPlus下1 MybatisPlus扩展功能1.1 代码生成1.2 静态工具1.3 逻辑删除1.4 枚举处理器1.5 JSON处理器**1.5.1.定义实体****1.5.2.使用类型处理器** **1.6 配置加密(选学)**1.6.1.生成秘钥**1.6.2.修改配置****…...
【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】
def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键,保持顺序ordered_keys []# 遍历data中的每个字典,添加其键到ordered_keys,如果该键还未被添加for d in original_list:for …...
IDEA的pom.xml显示ignored 的解决办法
问题: idea中创建Maven module时,pom.xml出现ignored。 原因: 相同名称的module在之前被创建删除过,IDEA会误以为新的同名文件是之前删除掉的,将这个新的module的pom.xml文件忽略掉显示ignored. 解决: 在…...
2. 卷积神经网络无法绕开的神——LeNet
卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层,2个卷积层,3个全连接层.核心权重层:卷积层、全连接层、循环层ÿ…...
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
审核看清楚了 ! 这是以太坊测试网络!用于学习的测试网络!!! 有关web3 和区块链的内容为什么要给我审核不通过? 别人凭什么可以发! 目标成果: 实现功能分析: 显示账户信…...
关于珞石机器人二次开发SDK的posture函数的算法RX RY RZ纠正 C#
在珞石SDK二次开发的函数钟,获取当前机器人位姿的函数posture函数在输出时会发现数据不正确,与示教器数据不一致。 其中第一个数据正确 第二三各数据为相反 第四五六各数据为弧度制 转换方法为(弧度/PI)*180度 然后发现第四个数据还要加上180度 第五…...
【Three.js基础学习】17.imported-models
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 课程回顾: 如何在three.js 中引入不同的模型? 1. 格式 (不同的格式) https://en.wikipedia.org/wiki/List_of_file_form…...
Spring Bean - xml 配置文件创建对象
类型: 1、值类型 2、null (标签) 3、特殊符号 (< -> < ) 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…...
uniapp map组件自定义markers标记点
需求是根据后端返回数据在地图上显示标记点,并且根据数据状态控制标记点颜色,标记点背景通过两张图片实现控制 <mapstyle"width: 100vw; height: 100vh;":markers"markers":longitude"locaInfo.longitude":latitude&…...
Windows:批处理脚本学习
目录 一、第一个批处理文件 1. &&和 | | 2. | 和 & 二、变量 1.传参变量%name 2.初始化变量set命令 3.变量的使用 4.局部变量与全局变量 5.使用环境变量 6.扩充变量语法 三、注释REM和 :: 四:函数 1.定义函数 2.…...
Dav_笔记10:Using SQL Plan Management之4
SQL管理库 SQL管理库(SMB)是驻留在SYSAUX表空间中的数据字典的一部分。它存储语句日志,计划历史记录,SQL计划基准和SQL配置文件。为了允许每周清除未使用的计划和日志,SMB使用自动空间管理。 您还可以手动将计划添加到SMB以获取一组SQL语句。从Oracle Database 11g之前的…...
通过json传递请求参数,如何处理动态参数和接口依赖
嗨,大家好,我是兰若姐姐,今天给大家讲一下如何通过json传递请求参数,如何处理动态参数和接口依赖 1. 使用配置文件和模板 在 test_data.json 中,你可以使用一些占位符或模板变量,然后在运行测试之前&…...
[240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
目录 Qt Creator 14 发布Qt Creator 14 版本发布,带来一系列新功能和改进终端用户可通过命令行方式查看此新闻终端用户可通过命令行方式安装软件: AMD 推迟 Ryzen 9000芯片发布 Qt Creator 14 发布 Qt Creator 14 版本发布,带来一系列新功能…...
PLSQL Developer工具查询数据,报错(动态性能表不可访问)
解决的问题: 解决方案: 在配置-首选项-选项,取消勾选“自动统计”,保存之后即可查询数据...
基于 HTML+ECharts 实现智慧交通数据可视化大屏(含源码)
构建智慧交通数据可视化大屏:基于 HTML 和 ECharts 的实现 随着城市化进程的加快,智慧交通系统已成为提升城市管理效率和居民生活质量的关键。通过数据可视化,交通管理部门可以实时监控交通流量、事故发生率、道路状况等关键指标,…...
探索 IT 领域的新宠儿:量子计算
目录 引言:从经典到量子的飞跃 量子计算的基本概念 量子计算的独特优势 量子计算的深度剖析 量子计算的最新进展 量子计算的行业应用前景 面临的挑战与未来展望 结语:迎接量子计算的新时代 引言:从经典到量子的飞跃 在信息技术飞速发…...
缠论自动化分析终极指南:通达信ChanlunX插件从入门到精通
缠论自动化分析终极指南:通达信ChanlunX插件从入门到精通 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为手工绘制缠论笔段而烦恼吗?还在为中枢识别不准确而困惑吗ÿ…...
企业级在线考试系统架构解决方案框架:学之思开源系统实施指南
企业级在线考试系统架构解决方案框架:学之思开源系统实施指南 【免费下载链接】xzs-mysql 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序,能覆盖到pc机…...
强化学习与控制理论融合:人形机器人自主恢复技术解析
1. 项目概述:当强化学习遇见经典控制理论在机器人研究领域,人形机器人从跌倒状态自主恢复一直是个棘手难题。传统方法要么依赖精心设计的脚本动作序列,要么采用纯数据驱动的强化学习策略,两者各有局限。我们的团队开发了一种混合架…...
别再手动调格式了!EndNote插入Word/WPS参考文献的3个高效技巧与4个常见Bug修复
别再手动调格式了!EndNote插入Word/WPS参考文献的3个高效技巧与4个常见Bug修复 文献管理工具EndNote与办公软件的协同使用,已成为科研工作者和学术写作者的标配。但当你在Word或WPS中插入参考文献时,是否经常遇到格式混乱、序号错位、插件失效…...
老芯片新玩法:拆解一个古董VCD机,看看里面的CD4051是怎么工作的
老芯片新玩法:拆解古董VCD机探秘CD4051的硬核逻辑 周末在电子市场淘到一台90年代国产VCD播放器,拆开外壳时主板上一枚标着"CD4051BE"的黑色芯片引起了我的注意。这种上世纪70年代问世的模拟开关芯片,如今在二手市场单价不到2元&…...
如何高效掌控电脑风扇:Fan Control完整配置指南
如何高效掌控电脑风扇:Fan Control完整配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanCo…...
Taotoken 模型广场如何帮助开发者为新项目选型
Taotoken 模型广场如何帮助开发者为新项目选型 启动一个新项目时,选择合适的模型是技术决策的关键一步。面对市场上众多的模型提供商和复杂的定价体系,开发者往往需要花费大量时间调研。Taotoken 的模型广场功能,正是为了简化这一过程而设计…...
告别混乱的日期逻辑!用Element Plus的el-date-picker打造‘航班查询’式精准范围控制
告别混乱的日期逻辑!用Element Plus的el-date-picker打造‘航班查询’式精准范围控制 在旅行预订类应用中,日期选择器是最核心的交互组件之一。想象一下这样的场景:用户选择去程日期后,返程日期只能在一定范围内选择——这正是携…...
2026届毕业生推荐的十大AI学术方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于当下的学术环境里,AI论文工具已深度融入至整个研究流程之中。那些高效的工具应…...
Cursor编辑器AI代理搭建:接入OpenRouter多模型,优化编码成本与效率
1. 项目概述:一个为开发者定制的智能编码代理最近在折腾AI编程助手,发现一个挺有意思的项目:pezzos/cursor-openrouter-proxy。简单来说,这是一个专门为Cursor编辑器设计的代理服务,它的核心功能是让Cursor能够接入Ope…...
