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

结构体笔记

 

结构体

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字节对齐:

  1. 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
  2. 结构体的首地址是最宽成员的倍数
  3. 结构体各个成员的首地址是该成员字节的整数倍,否则填充空字节

32位操作系统,4字节对齐:

  1. 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
  2. 结构体的首地址是最宽成员的倍数
  3. 结构体各个成员的首地址是该成员字节(或该成员字节数大于4则是4)的整数倍,否则填充空字节

共用体

概念:不同或者相同的数据,共用一段内存空间

作用:实现一段内存,存放不同的数据

格式:

union 共用名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}; //结尾的";"不可省略

*分析:

union:是结构体的关键字

共用名:满足命名规范

{}:不能省略

数据类型:可以是基本数据类型,也可以是构造数据类型

成员:可以是任意个成员

共用体的声明可以在任意位置,但一般在头文件中

共用体在声明类型时不占用内存空间,当使用共用体类型定义变量时申请空间

共用体的内存空间是最宽成员的内存大小

相关文章:

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…...

Elasticsearch:Golang ECS 日志记录 - zerolog

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。在本教程中&#xff0c;我将详述如何 编码器以 JSON 格式记录日志&#xff0c;并以 ECS 错误格式处理错误字段的记录。 默认情况下&#xff0c;会添加以下字段&…...

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款研发工时管理系统对比&#xff1a;PingCode、Worktile、无鱼项目工时系统、Toggl Track、泽众ALM、Asana、Jira、GitHub、Trello、TrackingTime。 在研发团队中&#xff0c;工时管理常常成为效率瓶颈&#xff0c;尤其是在资源分配和项目进度跟踪方面。选择合适…...

微服务-MybatisPlus下

微服务-MybatisPlus下 文章目录 微服务-MybatisPlus下1 MybatisPlus扩展功能1.1 代码生成1.2 静态工具1.3 逻辑删除1.4 枚举处理器1.5 JSON处理器**1.5.1.定义实体****1.5.2.使用类型处理器** **1.6 配置加密&#xff08;选学&#xff09;**1.6.1.生成秘钥**1.6.2.修改配置****…...

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键&#xff0c;保持顺序ordered_keys []# 遍历data中的每个字典&#xff0c;添加其键到ordered_keys&#xff0c;如果该键还未被添加for d in original_list:for …...

IDEA的pom.xml显示ignored 的解决办法

问题&#xff1a; idea中创建Maven module时&#xff0c;pom.xml出现ignored。 原因&#xff1a; 相同名称的module在之前被创建删除过&#xff0c;IDEA会误以为新的同名文件是之前删除掉的&#xff0c;将这个新的module的pom.xml文件忽略掉显示ignored. 解决&#xff1a; 在…...

2. 卷积神经网络无法绕开的神——LeNet

卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层&#xff0c;2个卷积层&#xff0c;3个全连接层.核心权重层&#xff1a;卷积层、全连接层、循环层&#xff…...

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 &#xff01; 这是以太坊测试网络&#xff01;用于学习的测试网络&#xff01;&#xff01;&#xff01; 有关web3 和区块链的内容为什么要给我审核不通过&#xff1f; 别人凭什么可以发&#xff01; 目标成果&#xff1a; 实现功能分析&#xff1a; 显示账户信…...

关于珞石机器人二次开发SDK的posture函数的算法RX RY RZ纠正 C#

在珞石SDK二次开发的函数钟&#xff0c;获取当前机器人位姿的函数posture函数在输出时会发现数据不正确&#xff0c;与示教器数据不一致。 其中第一个数据正确 第二三各数据为相反 第四五六各数据为弧度制 转换方法为(弧度/PI)*180度 然后发现第四个数据还要加上180度 第五…...

【Three.js基础学习】17.imported-models

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程回顾&#xff1a; 如何在three.js 中引入不同的模型&#xff1f; 1. 格式 &#xff08;不同的格式&#xff09; https://en.wikipedia.org/wiki/List_of_file_form…...

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…...

uniapp map组件自定义markers标记点

需求是根据后端返回数据在地图上显示标记点&#xff0c;并且根据数据状态控制标记点颜色&#xff0c;标记点背景通过两张图片实现控制 <mapstyle"width: 100vw; height: 100vh;":markers"markers":longitude"locaInfo.longitude":latitude&…...

Windows:批处理脚本学习

目录 一、第一个批处理文件 1. &&和 | | 2. | 和 & 二、变量 1.传参变量%name 2.初始化变量set命令 3.变量的使用 4.局部变量与全局变量 5.使用环境变量 6.扩充变量语法 三、注释REM和 &#xff1a;&#xff1a; 四&#xff1a;函数 1.定义函数 2.…...

Dav_笔记10:Using SQL Plan Management之4

SQL管理库 SQL管理库(SMB)是驻留在SYSAUX表空间中的数据字典的一部分。它存储语句日志,计划历史记录,SQL计划基准和SQL配置文件。为了允许每周清除未使用的计划和日志,SMB使用自动空间管理。 您还可以手动将计划添加到SMB以获取一组SQL语句。从Oracle Database 11g之前的…...

通过json传递请求参数,如何处理动态参数和接口依赖

嗨&#xff0c;大家好&#xff0c;我是兰若姐姐&#xff0c;今天给大家讲一下如何通过json传递请求参数&#xff0c;如何处理动态参数和接口依赖 1. 使用配置文件和模板 在 test_data.json 中&#xff0c;你可以使用一些占位符或模板变量&#xff0c;然后在运行测试之前&…...

[240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布

目录 Qt Creator 14 发布Qt Creator 14 版本发布&#xff0c;带来一系列新功能和改进终端用户可通过命令行方式查看此新闻终端用户可通过命令行方式安装软件&#xff1a; AMD 推迟 Ryzen 9000芯片发布 Qt Creator 14 发布 Qt Creator 14 版本发布&#xff0c;带来一系列新功能…...

PLSQL Developer工具查询数据,报错(动态性能表不可访问)

解决的问题&#xff1a; 解决方案&#xff1a; 在配置-首选项-选项&#xff0c;取消勾选“自动统计”&#xff0c;保存之后即可查询数据...

基于 HTML+ECharts 实现智慧交通数据可视化大屏(含源码)

构建智慧交通数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着城市化进程的加快&#xff0c;智慧交通系统已成为提升城市管理效率和居民生活质量的关键。通过数据可视化&#xff0c;交通管理部门可以实时监控交通流量、事故发生率、道路状况等关键指标&#xff0c;…...

探索 IT 领域的新宠儿:量子计算

目录 引言&#xff1a;从经典到量子的飞跃 量子计算的基本概念 量子计算的独特优势 量子计算的深度剖析 量子计算的最新进展 量子计算的行业应用前景 面临的挑战与未来展望 结语&#xff1a;迎接量子计算的新时代 引言&#xff1a;从经典到量子的飞跃 在信息技术飞速发…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...