c语言结构体(初阶)

1. 结构体的声明

1.1 结构体的基础知识

结构是一些值的集合,这些值被称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构的声明

struct tag
{member - list;
}variable-list;

例:描述一个人的信息:名字+电话+性别+身高

//声明的结构体类型struct peo
struct peo
{char name[20];//名字char tela[12];//电话char sex[5];//性别int high;//学号
}p1, p2;//分号不能丢

其中p1和p2是使用struct peo结构类型创建的两个变量,可以也就是p1和p2分别可以放一个人的信息。 但是因为p1和p2放在大括号的外面,所以p1和p2是两个全局的结构体变量。要想使其成为局部变量,我们可以使用下面这种方法创建结构体变量。

struct peo
{char name[20];//名字char tela[12];//电话char sex[5];//性别int high;//学号
};//分号不能丢​
int main()
{struct peo p1 = { 0 };//结构体变量的创建return 0;
}

1.3 结构体成员的类型

结构的成员可以是标量、数组、指针,甚至是其他的结构体。

struct peo
{char name[20];//数组};struct st
{struct peo p;//其他结构体int num;//标量float* f = num;//指针
};

1.4 结构体变量的定义和初始化

根据上面那个例题,我们可以如下初始化:

#define<stdio.h>
struct peo
{char name[20];//名字char tela[12];//电话char sex[5];//性别int high;//学号
};//分号不能丢​
int main()
{struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建return 0;
}

结构体成员包含结构体的结构体变量初始化:

我们需要再用一个{ }将结构体中包含的结构体初始化。

操作如下: 

#define<stdio.h>
struct peo
{char name[20];//名字char tela[12];//年龄char sex[5];//性别int high;//学号
};//分号不能丢​
struct st
{struct peo p;int num;
};
int main()
{struct st s = { {"暴龙战士","88888888888","男",250},66 };return 0;
}

初始化后我们可以按照以下的方法将其打印出来:

#define<stdio.h>
struct peo
{char name[20];//名字char tela[12];//年龄char sex[5];//性别int high;//学号
};//分号不能丢​
struct st
{struct peo p;int num;
};
int main()
{struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建struct st s = { {"暴龙战士","88888888888","男",250},66 };printf("%s %s %s %d \n",p1.name,p1.tela,p1.sex,p1.high );printf("%s %s %s %d %d\n", s.p.name, s.p.tela, s.p.sex, s.p.high, s.num);return 0;
}

也就是:结构体变量+.+成员变量。 

 

2.结构体成员的访问

如果是结构体指针访问指向对象的成员:就用  结构体指针 -> 成员变量  的形式打印

如果是结构体变量访问成员:就用  结构体变量 . 成员变量  的形式打印

具体操作如下:

#define<stdio.h>
struct st
{struct peo p;int num;
};
void print1(struct peo* sp)
{printf("%s %s %s %d \n", sp->name, sp->tela, sp->sex, sp->high);//结构体指针 -> 成员变量
}
void print2(struct peo p)
{printf("%s %s %s %d \n", p.name, p.tela, p.sex, p.high);//结构体变量 . 成员变量
}
int main()
{struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建struct st s = { {"暴龙战士","88888888888","男",250},66 };print1(&p1);print2(p1);return 0;
}

3.结构体传参

我们知道形参是实参的临时拷贝,如果使用结构体变量访问成员时形参就会将实参拷贝一份,这样就需要多开辟一块空间,就会结构体过大,参数压栈的系统开销比较大,从而导致性能的下降。

而使用结构体指针访问指向变量的成员时(如上述代码),我们只是将&p1(4个或8个字节)的地址传给sp而已。

结论:结构体传参的时候,要传结构体的地址。

4.结构体数组  

使用结构体变量建立数据类型后,我们就可以利用这个数据类型创建数组,就比如创建整形数组就可以写为 int arr[ ],那么创建一个自己建立的数据类型的数组就可以写为:

声明的结构体类型名 + 数组名。

例如我们声明一个结构体类型struct my后,就可以在主函数写一个struct my类型的数组。如下:

struct my
{
int a;
char b;
int arr[5];
};
int main()
{
struct my brr[5];
}

     例题1:

(1)定义一个结构体变量Birthday用来存放一个人的出生日期(年、月、日)。

(2)定义一个结构体变量Student 用来存放学生个人信息,包括姓名(10个字符),学号(长整型)、出生日期、身高、体重)

(3)定义一个结构体数组MyClass用来存放5个学生的信息

编写程序实现要求从键盘输入5个同学的信息,然后输出5个同学的信息。

#define<stdio.h>
struct Birthday
{int year;int	month;int day;
};
struct Student
{char name[10];//名字long int num;//学号struct Birthday p;//出生日期int hight;//身高int weight;//体重
};int main()
{struct Student MyClass[5];for (int i = 0; i < 5; i++){printf("输入第%d个学生的信息:\n ", i + 1);printf("名字:");scanf("%s", &MyClass[i].name);printf("学号:");scanf("%ld", &MyClass[i].num);printf("生日日期(年 月 日):");scanf("%d %d %d", &MyClass[i].p.year, &MyClass[i].p.month, &MyClass[i].p.day);printf("身高:");scanf("%d", &MyClass[i].hight);printf("体重:");scanf("%d", &MyClass[i].weight);}printf("\n");for (int j = 0; j < 5; j++){printf("输出第%d个学生的信息:\n", j + 1);printf("名字:");printf("%s\n", MyClass[j].name);printf("学号:");printf("%ld\n", MyClass[j].num);printf("生日日期(年 月 日):");printf("%d %d %d\n", MyClass[j].p.year, MyClass[j].p.month, MyClass[j].p.day);printf("身高:");printf("%d\n", MyClass[j].hight);printf("体重:");printf("%d\n", MyClass[j].weight);}return 0;
}

例题2:

 有5个学生,每个学生的数据包括学号、姓名、3门课的成绩。从键盘输入5个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程的成绩、平均分数)。 要求用一个input函数输入5个学生数据,用一个 average 函数求总平均分,用 max 函数找出最高分学生数据。总平均分和最高分的学生的数据都在主函数中输出。

#define<stdio.h>
#define n 5
struct stu
{long int num;//学号char name[10];//名字int a;//科目一int b;//科目二int c;//科目三
};
void input(struct stu arr[n])
{for (int i = 0; i < n; i++){printf("输入第%d个学生的数据:\n", i + 1);printf("输入学号:");scanf("%ld", &arr[i].num);printf("输入名字:");scanf("%s", &arr[i].name);printf("输入科目一:");scanf("%d", &arr[i].a);printf("输入科目二:");scanf("%d", &arr[i].b);printf("输入科目三:");scanf("%d", &arr[i].c);}
}
double average(struct stu arr[n])
{double x = 0;for (int i = 0; i < n; i++){x += arr[i].a + arr[i].b + arr[i].c;}return x / (n * 3);
}
int max(struct stu arr[n])
{int x = arr[0].a + arr[0].b + arr[0].c;int y = 0;for (int i = 1; i < n; i++){if (x < arr[i].a + arr[i].b + arr[i].c){x = arr[i].a + arr[i].b + arr[i].c;y = i;}}return y;
}
int main()
{struct stu arr[n];input(arr);double avera = average(arr);printf("总平均分:");printf("%lf\n", avera);int ma = max(arr);printf("最高分的学生的数据:\n");printf("学号:");printf("%d\n", arr[ma].num);printf("名字:");printf("%s\n", arr[ma].name);printf("科目一:");printf("%d\n", arr[ma].a);printf("科目二:");printf("%d\n", arr[ma].b);printf("科目三:");printf("%d\n", arr[ma].c);return 0;
}

 

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

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

相关文章

深入浅出:分布式、CAP 和 BASE 理论(荣耀典藏版)

大家好&#xff0c;我是月夜枫&#xff0c;一个漂泊江湖多年的 985 非科班程序员&#xff0c;曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 在计算机科学领域&#xff0c;分布式系统是一门极具挑战性的研究方向&#xff0c;也是互联网应用中必不可少的优化实践&…

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…

ROS学习记录:如何在Github上寻找并安装软件包

一、打开网页输入www.github.com 二、进入github界面 三、打开一个终端&#xff0c;输入mkdir catkin_ws1建立一个工作空间 四、使用cd catkin_ws1进入工作空间 五、使用mkdir src创建一个子目录src就是source&#xff0c;原始资料的意思,指的就是程序源代码这类资源材料&#…

小机器人,电子锁,牙刷,表类开关,磁阀开关等一些安防直流驱动的选型介绍分析

安防监控是一门被人们日益重视的新兴行业&#xff0c;就目前发展来看&#xff0c;应用普及程度越来越广&#xff0c;科技含量也越来越高&#xff0c;几乎所有高新科技都可促进其发展&#xff0c;尤其是信息时代的来临&#xff0c;更为该行业的发展提供契机。其中安防领域最为典…

electron 菜单栏打开指定url页面菜单实现方法

electron 菜单栏打开指定url页面菜单 可以是本地URL也可以是远程的URL 自动判断跳转 以下代码可以在主进程main.js里面也可以是在独立的模块文件里面 const { BrowserWindow } require(electron);//定义窗口加载URL export const winURL process.env.NODE_ENV development …

Android原生实现单选

六年前写的一个控件&#xff0c;一直没有时间总结&#xff0c;趁年底不怎么忙&#xff0c;整理一下之前写过的组件。供大家一起参考学习。废话不多说&#xff0c;先上图。 一、效果图 实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的backgr…

企业私有云容器化架构运维实战

企业私有云容器化架构运维实战 了解 什么是虚拟化: 虚拟化&#xff08;Virtualization&#xff09;技术最早出现在 20 世纪 60 年代的 IBM 大型机系统&#xff0c;在70年代的 System 370 系列中逐渐流行起来&#xff0c;这些机器通过一种叫虚拟机监控器&#xff08;Virtual M…

java浅拷贝BeanUtils.copyProperties引发的RPC异常 | 京东物流技术团队

背景 近期参与了一个攻坚项目&#xff0c;前期因为其他流程原因&#xff0c;测试时间已经耽搁了好几天了&#xff0c;本以为已经解决了卡点&#xff0c;后续流程应该顺顺利利的&#xff0c;没想到 人在地铁上&#xff0c;bug从咚咚来~ 没有任何修改的服务接口&#xff0c;抛出…

配置管理员使用Local方式认证并授权用户级别示例

AAA简介 访问控制是用来控制哪些用户可以访问网络以及可以访问的网络资源。AAA是Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和Accounting&#xff08;计费&#xff09;的简称&#xff0c;提供了在NAS&#xff08;Network Access…

OpenAI大模型中的模型推理

模型推理 推理有两个方案&#xff0c;一个和训练相同&#xff0c;直接加入Lora层&#xff0c;不过会增加推理延时因为多了lora层的计算&#xff0c;适合线下测评用&#xff0c;如下 from peft import PeftModel from transformers import AutoModel, AutoTokenizer ​ model …

解密负载均衡:如何平衡系统负载(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

spring boot 增量包部署,jar包变小

##pom.xml配置 <plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layout>ZIP</layout><includes><include><groupId&…

云原生数据库性能对比(阿里云、百度智能云、腾讯云)

本文作者 LYZ 近些年&#xff0c;云原生数据库成为云厂商的重要发展方向&#xff0c;阿里云、百度智能云、腾讯云均先后发布了自研的云原生数据库。笔者认为云原生数据库具有更高的性价比、更极致的弹性&#xff0c;可以满足业务发展的不同阶段和负载场景的需求&#xff0c;也是…

FPGA高端项目:SDI 视频+音频编解码,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、设计思路和框架设计框图GV8601A均衡EQGTX 时钟要求GTX 调用与控制SMPTE SD/HD/3G-SDISMPTE SD/HD/3G-SDI 接收SMPTE SD/HD/3G-SDI 发送 SDI 视频接收数据处理SDI 音频接收-…

pycharm 工具栏不见了

新版pycharm后&#xff0c; 菜单栏和工具栏不见了 目录 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 另外&#xff0c;一些使用pycharm的新手可能会由于不熟悉软件的功能而误操作&#xff…

【头歌实训】PySpark Streaming 数据源

文章目录 第1关&#xff1a;MySQL 数据源任务描述相关知识PySpark JDBC 概述PySpark JDBCPySpark Streaming JDBC 编程要求测试说明答案代码 第2关&#xff1a;Kafka 数据源任务描述相关知识Kafka 概述Kafka 使用基础PySpark Streaming Kafka 编程要求测试说明答案代码 第1关&a…

scikit-learn文档中的数据生成器

目录 1. make_classification: 2. make_regression: 3. make_blobs: 4. make_moons: 5.make_circles 6. make_sparse_coded_signal: 1. make_classification: 这是一个用于生成复杂二维数据的函数&#xff0c;通常用于可视化分类器的学习过程或者测试机器学习算法的性能…

Kali Linux如何启动SSH并在Windows系统远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

工具系列:TimeGPT_(9)模型交叉验证

交叉验证 文章目录 交叉验证外生变量比较不同的模型 时间序列预测中的主要挑战之一是随着时间的推移固有的不确定性和变异性&#xff0c;因此验证所采用的模型的准确性和可靠性至关重要。交叉验证是一种强大的模型验证技术&#xff0c;特别适用于此任务&#xff0c;因为它提供了…

使用 GitHub 进行团队协作的操作指南

目录 前言1 使用github进行团队开发的意义2 邀请成员加入团队3 克隆和提交代码3.1 克隆远程仓库到本地3.2 加入暂存区3.3 提交修改到本地仓库3.4 设置本地仓库和远程仓库的关联3.5 将本地仓库的代码推送到远程仓库 结语 前言 GitHub 是一个广泛使用的基于 Git 的代码托管平台&…