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

C语言——结构体数组、结构体指针、结构体函数与二级指针

C语言中的结构体(struct)是一种用户自定义的数据类型,它允许你将不同类型的数据项组合成一个单一的类型。结构体数组则是一种特殊的数组,其元素为结构体类型。这意味着你可以在一个数组中存储多个具有相同结构的记录。

定义结构体数组

首先,你需要定义一个结构体类型,然后才能声明该类型的数组。

定义结构体
typedef struct Student {char *num;int age;double score;char *addr;
}Student;
声明结构体数组
struct Student arr[3];

这里,arr是一个结构体数组,可以存储3个Student类型的记录。

初始化结构体数组

可以直接在声明时初始化结构体数组的元素。

	struct Student arr[3] = {{"001",22,99.9,"云南"},{"002",23,96.35,"上海"},{"003",21,89.956,"广州"}};

访问结构体数组元素

你可以通过数组索引来访问结构体数组中的元素,并通过点操作符.来访问结构体成员。

len = sizeof(arr)/sizeof(arr[0]);for(i=0;i<len;i++){printf("学号:%s 年龄:%d 成绩:%.3lf 地址: %s\n",arr[i].num,arr[i].age,arr[i].score,arr[i].addr);}

输出为:

学号:001 年龄:22 成绩:99.900 地址:云南
学号:002 年龄:23 成绩:96.350 地址:上海
学号:003 年龄:21 成绩:89.956 地址:广州

结构体数组的使用场景

结构体数组非常有用,特别是在需要处理具有多个属性的数据集合时。例如,你可以使用结构体数组来存储班级中所有学生的信息,然后遍历这个数组来执行各种操作,如计算平均分、查找成绩最高的学生等。

结构体练习:选票系统

#include<stdio.h>
#include<string.h>struct XuanMin{char name[32];int  tickets;
};int main()
{struct XuanMin candidate[3];struct XuanMin max = {"0",0};int len;int i;int j;char tempname[32];int abandon;int abandtick = 0;len = sizeof(candidate)/sizeof(candidate[0]);for(i=0;i<len;i++){candidate[i].tickets = 0;printf("请输入候选人的名字:\n",candidate[i]);scanf("%s",candidate[i].name);}for(j=0;j<5;j++){abandon = 0;printf("请输入所要投的候选人的名字:\n");scanf("%s",tempname);for(i=0;i<3;i++){if(strcmp(tempname,candidate[i].name) == 0){candidate[i].tickets++;abandon = 1;}}if(abandon == 0){printf("无所选候选人,弃票!\n");abandtick++;}}for(i=0;i<3;i++){printf("候选人:%s,票数:%d\n",candidate[i].name,candidate[i].tickets);}for(i=0;i<3;i++){if(max.tickets < candidate[i].tickets){max = candidate[i];}}printf("%s当选,票数:%d,弃票:%d",max.name,max.tickets,abandtick);return 0;
}

输出为:

请输入候选人的名字:
aa
请输入候选人的名字:
bb
请输入候选人的名字:
cc
请输入所要投的候选人的名字:
aa
请输入所要投的候选人的名字:
aa
请输入所要投的候选人的名字:
bb
请输入所要投的候选人的名字:
cc
请输入所要投的候选人的名字:
a
无所选候选人,弃票!
候选人:aa,票数:2
候选人:bb,票数:1
候选人:cc,票数:1
aa当选,票数:2,弃票:1

结构体指针

结构体指针是指向结构体变量的指针,它存储的是结构体变量的内存地址,而不是结构体变量的值本身。使用结构体指针可以方便地访问和操作结构体中的成员,特别是在处理大型数据结构或链表等数据结构时。

定义结构体和结构体指针

首先,你需要定义一个结构体类型,然后才能创建结构体变量和结构体指针。

//定义一个结构体
struct Test{         char cdata;int  idata;
};//定义结构体指针
struct Test t1 = {'A',0};
struct Test *pt = &t1;

使用结构体指针访问结构体成员

通过结构体指针访问结构体成员需要使用解引用操作符(->

pt->cdata = 'C';
pt->idata = 1;
printf("t1的cdata=%c,idata=%d\n",t1.cdata,t1.idata);
printf("t1的cdata=%c,idata=%d\n",pt->cdata,pt->idata);

输出为:

t1的cdata=C,idata=1
t1的cdata=C,idata=1

使用场景:结构体数组进行打印

struct Student arr[3] = {{"001",22,99.9,"云南"},{"002",23,96.35,"上海"},{"003",21,89.956,"广州"}
};
struct Student *p;
p = arr;len = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<len;i++){printf("学号:%s 年龄:%d 成绩:%.3lf 地址:%s\n",p->num,p->age,p->score,p->addr);p++;
}

练习:使用结构体指针实现选票系统

使用结构体指针要注意:

1.解引用符要使用“->”

2.每次遍历完循环内要使用p++;

循环外要记得让p重新指向数组头

#include<stdio.h>
#include<string.h>struct XuanMin{char name[32];int  tickets;
};int main()
{struct XuanMin candidate[3];struct XuanMin max = {"0",0};int len;int i;int j;char tempname[32];int abandon;int abandtick = 0;struct XuanMin *p = candidate;len = sizeof(candidate)/sizeof(candidate[0]);for(i=0;i<len;i++){p->tickets = 0;printf("请输入候选人的名字:\n");scanf("%s",p->name);p++;}for(j=0;j<5;j++){p = candidate;abandon = 0;printf("请输入所要投的候选人的名字:\n");scanf("%s",tempname);for(i=0;i<3;i++){if(strcmp(tempname,p->name) == 0){p->tickets++;abandon = 1;}p++;}if(abandon == 0){printf("无所选候选人,弃票!\n");abandtick++;}}p = candidate;for(i=0;i<3;i++){printf("候选人:%s,票数:%d\n",p->name,p->tickets);p++;}p = candidate;for(i=0;i<3;i++){if(max.tickets < p->tickets){max = *p;p++;}}printf("%s当选,票数:%d,弃票:%d",max.name,max.tickets,abandtick);return 0;
}

输出为:

请输入候选人的名字:
aa
请输入候选人的名字:
bb
请输入候选人的名字:
cc
请输入所要投的候选人的名字:
aa
请输入所要投的候选人的名字:
aa
请输入所要投的候选人的名字:
bb
请输入所要投的候选人的名字:
cc
请输入所要投的候选人的名字:
a
无所选候选人,弃票!
候选人:aa,票数:2
候选人:bb,票数:1
候选人:cc,票数:1
aa当选,票数:2,弃票:1

结构体在函数中的应用:

一个返回值为结构体变量的函数,一般使用结构体指针进行定义:

struct XuanMin{char name[32];int  tickets;
};struct XuanMin* initcandidate(struct XuanMin *p)
{return p;
}

使用函数对选票系统进行封装如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>struct XuanMin{char name[32];int  tickets;
};struct XuanMin* initcandidate(struct XuanMin *p,int *total) //候选人初始化
{int i;if(p == NULL){printf("请输入候选总人数:\n");scanf("%d",total);p = (struct XuanMin*)malloc(*total*sizeof(struct XuanMin));}for(i=0;i<*total;i++){p->tickets = 0;printf("请输入第%d个候选人的名字:\n",i+1);scanf("%s",p->name);p++;}return p-*total;
}void printicket(struct XuanMin *p,int len)  //打印候选人信息
{int i;for(i=0;i<len;i++){printf("候选人:%s,票数:%d\n",p->name,p->tickets);p++;}
}int doVot(struct XuanMin *p,int len)  //选民进行投票
{int i;int j;int mark;int abandtick = 0;char tempname[32];struct XuanMin *pbak = p;for(j=0;j<5;j++){p = pbak;mark = 0;printf("请输入所要投的候选人的名字:\n");scanf("%s",tempname);for(i=0;i<3;i++){if(strcmp(tempname,p->name) == 0){p->tickets++;mark = 1;}p++;}if(mark == 0){printf("无所选候选人,弃票!\n");abandtick++;}}return abandtick;
}struct XuanMin* getMax(struct XuanMin *p,int len)  //找出票数最高的候选人
{struct XuanMin *max;int i;max = p;for(i=0;i<len;i++){if(max->tickets < p->tickets){max = p;}p++;}return max;
}int main()
{struct XuanMin *candidate = NULL;int *len;struct XuanMin *final;int abandon;candidate = initcandidate(candidate,len);printicket(candidate,*len);abandon = doVot(candidate,*len);printicket(candidate,*len);final = getMax(candidate,*len);printf("%s当选,票数:%d,弃票:%d",final->name,final->tickets,abandon);return 0;
}

注意:

使用结构体变量作为返回值的函数,一般使用的都是结构体指针,即返回的值是结构体指针。

结构体二级指针:

在上边的选票系统中使用initcandidate函数对候选人变量candidate进行初始化,包括候选人的姓名和票数,在initcandidate函数中我们将结构体指针变量candidate传递进去进行初始化,并返回给主函数中。

我们可以使用二级指针将结构体指针变量candidate的地址传递过去,进行操作,就可以将initcandidate初始化函数变为无返回值的函数。同理就像我们把表示候选人数量的变量len的地址传递过去,这样在初始化函数中获得候选人数量len的值以后,不需要使用返回值就能在主函数中获取len的值。

使用结构体二级指针代码如下:

void initcandidate(struct XuanMin **p,int *total)
{int i;if(*p == NULL){printf("请输入候选总人数:\n");scanf("%d",total);*p = (struct XuanMin*)malloc(*total * sizeof(struct XuanMin));}for(i=0;i<*total;i++){(*p)->tickets = 0;printf("请输入第%d个候选人的名字:\n",i+1);scanf("%s",(*p)->name);(*p)++;}*p = *p - *total;
}

注意:使用二级指针访问结构体变量时依旧使用“->”解引用操作符,而且要注意优先级使用“(*p)->tickets”、“(*p)++”这种格式来访问。

 

相关文章:

C语言——结构体数组、结构体指针、结构体函数与二级指针

C语言中的结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;它允许你将不同类型的数据项组合成一个单一的类型。结构体数组则是一种特殊的数组&#xff0c;其元素为结构体类型。这意味着你可以在一个数组中存储多个具有相同结构的记录。 定义结构体…...

【4】策略模式

如上图所示&#xff0c;如果要加入一个新的货币&#xff0c;那么就需要对类中的Calculate函数进行修改&#xff0c;这违背了封闭开放原则。 上图中的方式更加合适&#xff0c;搞一个抽象类&#xff08;方法中可以用多态调用&#xff09;&#xff0c;然后每个货币自己是一个类&a…...

BGP 反射器联邦实验

要求&#xff1a; 1.如图连接网络&#xff0c;合理规划IP地址&#xff0c;AS 200内IGP协议为OSPF 2.R1属于AS 100&#xff1b;R2-R3-R4小AS 234 R5-R6-R7小AS 567&#xff0c;同时声明大AS 200&#xff0c;R8属于AS 300 3.R2-R5 R4-R7 之间为联邦EBGP邻居关系 4.R1-R8之…...

stm32入门学习13-时钟RTC

&#xff08;一&#xff09;时钟RTC stm32内部集成了一个秒计数器RTC&#xff0c;用于显示我们日常的时间&#xff0c;如日期年月日&#xff0c;时分秒等&#xff0c;RTC的主要原理就是进行每秒自增&#xff0c;如果我们知道开始记秒的开始时间&#xff0c;就可以计算现在的日…...

vuex properties of undefined (reading ‘getters‘)

前言&#xff1a; 最近打算用vue 写个音乐播放器&#xff0c;在搞 vuex 的时候遇到一个很神奇报错&#xff1b;vuex 姿势练了千百次了&#xff0c;刚开始的时候我一直以为是代码问题&#xff0c;反复检查了带了&#xff0c;依旧报错。 Error in mounted hook: "TypeError:…...

再谈表的约束

文章目录 自增长唯一键外键 自增长 auto_increment&#xff1a;当对应的字段&#xff0c;不给值&#xff0c;会自动的被系统触发&#xff0c;系统会从当前字段中已经有的最大值1操作&#xff0c;得到一个新的不同的值。通常和主键搭配使用&#xff0c;作为逻辑主键。 自增长的…...

认识一下测试策略与测试方案

目录 测试方案 测试策略 测试策略的内容主要包括 测试技术和工具 测试启动、停止和完成标准 风险分析和应对方案 测试范围 测试角色和职责 测试方法和类型 测试工具 测试层级 测试指标 测试可交付成果 测试方案的内容包括 测试目标 测试范围 测试环境 测试策略…...

Gradle 查看包的依赖关系

在 Terminal 中可以通过 gradle 的命令查看项目中使用的依赖库及其版本&#xff0c;并且可以更加直观的看到各个模块中库之间的依赖关系。同时也可以跟踪并解决与库版本冲突有关的问题。 工具查看 在 Android Studio 中选择 View > Tool Windoors > Gradle 或者直接选择…...

虚幻5|给攻击添加特效

一&#xff0c;打开武器蓝图 选择武器网格体&#xff0c;在细节处找到组件开始重叠&#xff0c;点击 写下以下蓝图&#xff0c;这是最终蓝图&#xff0c;后面会分讲要点 二&#xff0c;actor拥有标签&#xff0c;就是被击打的敌人&#xff0c;我们给actor添加标签 到主界面&am…...

Delphi包管理与依赖:掌握GetIt与DelphiPI的艺术

标题&#xff1a;Delphi包管理与依赖&#xff1a;掌握GetIt与DelphiPI的艺术 在Delphi的广袤生态中&#xff0c;包管理和依赖解决方案是构建大型项目不可或缺的工具。本文将深入探讨Delphi中的两种主要包管理工具&#xff1a;GetIt包管理器和DelphiPI&#xff0c;通过实际代码…...

如何使用unittest和pytest进行python脚本的单元测试

1. 关于unittest和pytest unittest是python内置的支持单元测试的模块&#xff0c;他提供了核心类&#xff0c;TestCase&#xff0c;让单元测试 代码的编写不再是从0开始&#xff0c;不再是作坊式&#xff0c;而是标准化&#xff0c;模板化&#xff0c;工厂化。 pytest是第三方…...

Java中的值传递与引用传递

Java中的值传递与引用传递 在Java编程中&#xff0c;理解值传递与引用传递的概念是编写无误代码的关键。这两个概念有时会让人感到困惑&#xff0c;特别是当它们与对象有关时。现在&#xff0c;我们将一步步地解释这两个概念&#xff0c;帮助你彻底理解它们。 1. 值传递与引用…...

Seaborn库

目录 主要功能和特点 使用方法 实例应用 Seaborn库的最新版本有哪些新功能和改进&#xff1f; 如何在Seaborn中实现复杂的数据预处理步骤&#xff0c;例如数据清洗和转换&#xff1f; Seaborn与其他数据可视化库&#xff08;如Matplotlib、Plotly&#xff09;相比有哪些优…...

openresty整合modsecurity

安装依赖包 安装依赖 yum -y install gcc-c flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel libtool libxml2-devel libxslt-devel安装依赖包 ftp://ftp.icm.edu.pl/vol/rzm7/linux-centos-vault/7.8.2003/sclo/x86_64/rh/Packages/d/devtools…...

结构体structure、共用体union

目录 结构体 结构体类型的定义形式 结构体类型的大小 内存计算例子 共用体union 用共用体判断大小端 结构体和共用体对比 qsort&#xff08;&#xff09; 结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型&#xff08;用户自定义类型&#xff09; struc…...

Spring自动注册-<bean>标签和属性解析

xml文件中最常见也最核心的就是<bean>,<Import>,<beans>,<alias>标签,关于它们的解析主要是BeanDefinitionParserDelegate类中.<bean>标签的解析最为复杂和重要. <bean>标签 processBeanDefinition(ele, delegate)方法中,主要是是对…...

【仿RabbitMQ消息队列】基于C++11中packaged_tack异步线程池

目录 什么是同步和异步&#xff1f; future 使用future和async配合管理异步任务 使用promise和future配合管理异步任务 使⽤std::packaged_task和std::future配合 C11异步线程池 什么是同步和异步&#xff1f; 同步&#xff08;Synchronous&#xff09; 同步编程是指程…...

免费下载专利

给大家提供一个可以免费下载专利的地方 链接&#xff1a;https://www.drugfuture.com/cnpat/cn_patent.asp...

CentOS7安装流程步骤详细教程

1. 简介 1.1. 概述 CentOS 7是一款基于Red Hat Enterprise Linux(RHEL)的开源Linux发行版,它提供了一个稳定、安全、高效的操作系统,适用于企业级应用、服务器、云计算等领域。CentOS 7以其高度的稳定性和安全性而闻名,它广泛应用于各种行业和领域,包括政府、金融、医疗、…...

【大模型从入门到精通17】openAI API 构建和评估大型语言模型(LLM)应用5

这里写目录标题 理论问题&#xff1a;实践问题&#xff1a;理论实践 理论问题&#xff1a; 1.描述评估LLM应用程序输出的重要性&#xff0c;并提及至少三个维度&#xff0c;这些输出应该在这几个维度上被评估。 2.解释在评估LLM应用程序时开发稳健的性能指标的作用&#xff0c…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...