C语言结构体数组

news2025/1/8 11:49:25

上次我们讲解了结构体,这里还有高级应用就是结构体数组(集合的集合)

(这里提醒一句,想要在北京参加NCRE考试的朋友们今天开始报名了)

定义

还是拿上回那个学生数据的结构体

typedef struct {
    int year;
    int month;
    int day;
} Date;
 
typedef struct {
    int num;
    char name[20];
    char sex;
    Date birth;
    float score;
} Student;
Student S[10];    //可以存放10个学生数据

然后就是循环操作录入输出,这一块优点就是好理解,集合嘛,大家或多或少都了解

数据结构的一大功能就是能够把无序的、海量的数据有条理的分类储存从而方便修改、加工输出,可以说学好数据结构对我们的生活都有帮助,帮助我们把生活有序化(比如把各种东西分类存放在箱子里,程序员爱穿格子衫也是对这种有序的规则热爱的体现)

接下来操作就和数组没什么区别了,唯一不同就是这个数组一个元素里面可以存放多个东西

可以看出来很有条理与结构,这也是数据结构最终目标,因为有了条理与结构就可以把现实生活中各种东西数字化然后在n维空间变成各种向量再交给计算机(机器)重复单一操作,没错这就是人工智能大模型底层逻辑(线性代数实际应用) 

遍历

#include <stdio.h>
#include <string.h>

typedef struct date {
    int year;
    int month;
    int day;
} Date;

typedef struct {
    int num;
    char name[20];
    char sex;
    Date birth;
    float score;
} Student;

// 函数声明
void InputStudentInfo(Student *s);
void OutputStudentInfo(const Student *s);

int main() {
    Student S[10]; // 假设有一个学生数组

    // 输入学生信息
    for (int i = 0; i < 10; ++i) {
        printf("Enter information for student %d:\n", i + 1);
        InputStudentInfo(&S[i]);
    }

    // 输出学生信息
    for (int i = 0; i < 10; ++i) {
        printf("Information for student %d:\n", i + 1);
        OutputStudentInfo(&S[i]);
    }

    return 0;
}

// 输入学生信息的函数实现
void InputStudentInfo(Student *s) {
    if (s != NULL) {
        printf("Enter student number: ");
        scanf("%d", &s->num);
        printf("Enter student name: ");
        scanf("%s", s->name); // 注意:这里假设输入的名字不会超过19个字符,以避免缓冲区溢出
        printf("Enter student sex (M/F): ");
        scanf(" %c", &s->sex); // 注意:在%c前加一个空格,以忽略前面的换行符
        printf("Enter student birth (year month day): ");
        scanf("%d %d %d", &s->birth.year, &s->birth.month, &s->birth.day);
        printf("Enter student score: ");
        scanf("%f", &s->score);
    }
}

// 输出学生信息的函数实现
void OutputStudentInfo(const Student *s) {
    if (s != NULL) {
        printf("Student number: %d\n", s->num);
        printf("Student name: %s\n", s->name);
        printf("Student sex: %c\n", s->sex);
        printf("Student birth: %d-%02d-%02d\n", s->birth.year, s->birth.month, s->birth.day);
        printf("Student score: %.2f\n", s->score);
    }
}

语法注意

有没有发现一个不同?

之前我们都是

&s1.num
&s1.birth.year

但是今天对于数组来说发生变化

&s->num
&s->birth.year

看来有必要说一说 -> 和 . 的区别

. 是针对具体的,用于直接访问结构体变量的成员

比如上次的s1就是一个具体的实际的(不是一个数组)Student变量,如果上面的例子想用点就是具体的(数组中一个具体元素如s[0]),如果想要用 . 就应如下这么写

#include <stdio.h>

typedef struct {
    int year;
    int month;
    int day;
} Date;

typedef struct {
    int num;
    char name[20];
    char sex;
    Date birth;
    float score;
} Student;

// 函数声明
void InputStudentInfo(Student *s, int index);
void OutputStudentInfo(const Student *s, int index);

int main() {
    Student S[10]; // 假设我们有一个最多包含10个学生的数组

    // 输入学生信息
    for (int i = 0; i < 10; ++i) {
        InputStudentInfo(S, i);
    }

    // 输出学生信息
    for (int i = 0; i < 10; ++i) {
        OutputStudentInfo(S, i);
    }

    return 0;
}

// 输入学生信息的函数
void InputStudentInfo(Student *s, int index) {
    printf("Enter information for student %d:\n", index + 1);
    printf("Number: ");
    scanf("%d", &s[index].num);
    printf("Name: ");
    scanf("%s", s[index].name); // 注意:这里没有考虑字符串长度限制,可能会引起缓冲区溢出
    printf("Sex (M/F): ");
    scanf(" %c", &s[index].sex); // 注意:前面的空格用于消耗前一个输入后的换行符
    printf("Birth (year month day): ");
    scanf("%d %d %d", &s[index].birth.year, &s[index].birth.month, &s[index].birth.day);
    printf("Score: ");
    scanf("%f", &s[index].score);
}

// 输出学生信息的函数
void OutputStudentInfo(const Student *s, int index) {
    printf("\nInformation for student %d:\n", index + 1);
    printf("Number: %d\n", s[index].num);
    printf("Name: %s\n", s[index].name);
    printf("Sex: %c\n", s[index].sex);
    printf("Birth: %d-%02d-%02d\n", s[index].birth.year, s[index].birth.month, s[index].birth.day);
    printf("Score: %.2f\n", s[index].score);
}

->是指向操作,用于通过结构体指针访问结构体的成员,是用在抽象的指针上的

上文中数组s就是一个指针不是具体的,s->num 是通过结构体指针 s 访问 num 成员的方式,在这种情况下,&s->num 表示取 num 成员的地址,这时候就应该用箭头

但是注意嵌套的Birth是个Date类型结构体,是个具体的,所以是

&s->birth.year

个人建议

如果是简单操作,可以用具体的那种办法操作数组,毕竟简单直白

但是复杂任务还是推荐底下那个针对指针的,这块就是链表用的,我没法规定一个数组(要不链表又成数组了) ,每一个链表部分都是抽象的不是具体的(假如p是一个链表结构体变量,链表可没用过p[i]这么表述,因此 . 的用法完全用不了)

给大伙来点乐子保持对C语言的热情

这几天颂乐人偶(还在go)放出了新的PV,其中睦对祥子说过一句及其人机的话

 祥 移动(轻推w移动)

我们就以此为切入点写个关于动漫人物的结构体然后定义一下

#include<stdio.h>
#include<string.h>
#define saki TogawaSakiko
//定义saki就是大祥老师全名

typedef struct date
{
    int year;
    int month;
    int day;  
}Date;

typedef struct 
{
    char name[20];
    char sex;
    struct date birth;
    float money;    //日常迫害大祥
    char hobby[20];
    char story[100];
    ......
}Character;  

void move(Character a);

int main()
{
    Character saki;    //人物大祥
    move(saki);
    return 0;
}

void move(Character a)    //move函数
{


    ......
}

很抽象是不是,但是确实是实际应用(实际写游戏还真是这样),编程其实另一层意思就是把现实世界的东西变成一条一条的数据(人工智能领域有个工作就是整理生活中的事物变成电脑数据喂给ai)。

U3d也干了

U3d可以这么写程序

typedef struct {
    float x, y; // 位置坐标
    int health; // 生命值
    int attack; // 攻击力
    // 其他属性
} GameObject;

 然后就是接入接口啊什么的让u3d能读懂这一块c语言,就需要琢磨了

总结

1、学习了结构体数组

2、强调了 . 和 -> 的区别以及具体使用方法

3、整活激发热情

4、解开了数据结构目标与本质--把日常生活中各种东西数据化方便计算机处理

以上均是本人理解,如有不对欢迎各位大佬评论区指出~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解 ES6 Map:用法与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

在Vue3项目中使用svg-sprite-loader

1.普通的svg图片使用方式 1.1 路径引入 正常我们会把项目中的静态资源放在指定的一个目录&#xff0c;例如assets,使用起来就像 <img src"../assets/svgicons/about.svg" /> 1.2封装组件使用 显然上面的这种方法在项目开发中不太适用&#xff0c;每次都需…

谷歌SEO真的需要很长时间吗?

关键在于策略与执行力&#xff0c;很多人在刚开始做谷歌SEO时&#xff0c;都会产生一种挫败感&#xff0c;觉得排名变化太慢&#xff0c;看不到显著效果。这其实是因为SEO本身是一项需要时间的工作&#xff0c;特别是在竞争激烈的领域。但如果策略得当、执行力强&#xff0c;时…

耐高压26V输入5V升压充电8.4V芯片

HU6877作为一款集成了26V高耐压保护的5V升压至8.4V两节锂电池充电管理IC&#xff0c;凭借其高效升压、智能充电管理、多重安全保护及高耐压特性&#xff0c;在高端手电筒、便携式医疗设备、无人机等领域展现出了广泛的应用前景。本文将详细探讨HU6877的技术特点、工作原理、应用…

linuxCNC(六)配置LinuxCNC完成伺服控制

这里写目录标题 1、 cia402安装2、找伺服描述文件&#xff08;xml&#xff09;3、配置ethercat-config.xml3.1、打开hal-cia402/example/ethercat-conf.xml3.2、修改 ethercat-conf.xml文件中vid"0x000116c7" pid"0x003e0402"3.3、其他参数&#xff0c;根据…

【数据结构】链表(2):双向链表和双向循环链表

双向链表&#xff08;Doubly Linked List&#xff09; 定义&#xff1a; 每个节点包含三个部分&#xff1a; 数据域。前驱指针域&#xff08;指向前一个节点&#xff09;。后继指针域&#xff08;指向下一个节点&#xff09;。 支持从任意节点向前或向后遍历。 #define dat…

指针 const 的组合

1、首先来了解一下常量 const int num 5&#xff1b; 那么num的值是5&#xff0c; num的值不可修改 2、来了解一下指针 int value 5; int* p &value; 我喜欢吧指针和类型放一起&#xff0c;来强调p是一个指针类型&#xff0c; 而赋值的时候就得赋值一个int类型的地址…

Tableau数据可视化与仪表盘搭建-数据可视化原理

目录 内容 做个小实验 数据如何变成图表 1 2 维度和度量定义 3 度量映射图形&#xff0c;维度负责区分 1 可映射的数据类型 2 可视化字典 3 使用Tableau将数据变成图表(Tableau可视化原理) 1 2 拖拽 3 具体操作 4 总结 内容 点击左下角的工作表 tableau可以自动…

【WRF数据准备】气象驱动数据-ERA5是否需要单层位势数据?

目录 气象驱动数据-ERA5是否需要单层位势(Geopotential)数据?位势(Geopotential)输入的重要性Vtable的管理参考气象驱动数据-ERA5是否需要单层位势(Geopotential)数据? 本博客参考WRF论坛中讨论内容-How to use ERA5 Data From Copernicus Database,总结位势(Geopot…

用ResNet50+Qwen2-VL-2B-Instruct+LoRA模仿Diffusion-VLA的论文思路,在3090显卡上训练和测试成功

想一步步的实现Diffusion VLA论文的思路&#xff0c;不过论文的图像的输入用DINOv2进行特征提取的&#xff0c;我先把这个部分换成ResNet50。 老铁们&#xff0c;直接上代码&#xff1a; from PIL import Image import torch import torchvision.models as models from torch…

常见中间件漏洞(tomcat,weblogic,jboss,apache)

先准备好今天要使用的木马文件 使用哥斯拉生成木马 压缩成zip文件 改名为war后缀 一&#xff1a;Tomcat 1.1CVE-2017-12615 环境搭建 cd vulhub-master/tomcat/CVE-2017-12615 docker-compose up -d 1.首页抓包&#xff0c;修改为 PUT 方式提交 发送shell.jsp 和木马内容 …

嵌入式科普(26)为什么heap通常8字节对齐

目录 一、概述 二、newlibc heap 2.1 stm32cubeide .ld heap 2.2 e2studio .ld heap 三、glibc源码 3.1 Ubuntu c heap 四、总结 一、概述 结论&#xff1a;在嵌入式c语言中&#xff0c;heap通常8字节对齐 本文主要分析这个问题的分析过程 二、newlibc heap newlibc…

大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

CTF杂项——[NSSRound#4 SWPU]Pixel_Signin

得到一个像素点 提取像素点 脚本 from PIL import Image result open(1.txt,w) img Image.open("Pixel_Signin.png") img img.convert(RGB) for i in range(31):for j in range(31):r,g,b img.getpixel((j,i))print(r,g,b,end ,fileresult) 运行之后得到 把它…

Harmony开发【笔记1】报错解决(字段名写错了。。)

在利用axios从网络接收请求时&#xff0c;发现返回obj的code为“-1”&#xff0c;非常不解&#xff0c;利用console.log测试&#xff0c;更加不解&#xff0c;可知抛出错误是 “ E 其他错误: userName required”。但是我在测试时&#xff0c;它并没有体现为空&#xff0c;…

springCloudGateWay使用总结

1、什么是网关 功能: ①身份认证、权限验证 ②服务器路由、负载均衡 ③请求限流 2、gateway搭建 2.1、创建一个空项目 2.2、引入依赖 2.3、加配置 3、断言工厂 4、过滤工厂 5、全局过滤器 6、跨域问题

韩国机场WebGIS可视化集合Google遥感影像分析

目录 前言 一、相关基础数据介绍 1、韩国的机场信息 2、空间数据准备 二、Leaflet叠加Google地图 1、叠加google地图 2、空间点的标记及展示 3、韩国机场空间分布 三、相关成果展示 1、务安国际机场 2、有同类问题的机场 四、总结 前言 12月29日8时57分左右务安国际机…

电子电气架构 --- 设计车载充电机的关键考虑因素

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

python进阶06:MySQL

课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹&#xff0c;输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …

php反序列化原生态 ctfshow练习 字符串逃逸

web262 拿着题审计一下 <?php error_reporting(0); class message{public $from;public $msg;public $to;public $tokenuser;public function __construct($f,$m,$t){$this->from $f;$this->msg $m;$this->to $t;} }$f $_GET[f]; $m $_GET[m]; $t $_GET[t…