c语言结构体(初阶)

news2024/11/16 11:51:14

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.coloradmin.cn/o/1339244.html

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

相关文章

如何利用ChatGPT处理文本、论文写作、AI绘图、文献查阅、PPT编辑、编程等

无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的支持。它可以为您提供论文结构指导、段落重组建议…

LabVIEW快速入门

参考&#xff1a; 知乎labview快捷键 https://www.zhihu.com/question/287709225github 上 LabVIEW教程 https://lv.qizhen.xyz/LabVIEW 参考书籍 链接&#xff1a;https://pan.baidu.com/s/1irc0iftM0Gg3GCN2cBHCKw?pwdy1mz 提取码&#xff1a;y1mz --来自百度网盘超级会员V…

.NET 使用Camunda快速入门

一.工作流介绍 1. 什么是工作流 工作流&#xff08;Workflow&#xff09;&#xff0c;是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。 工作流将一套大的业务逻辑分解成业务逻辑段&#xff0c; 并统一控制这些业务逻辑段的执行条件&#xff0c;执行顺序以及相互通…

【双系统】Windows10+Ubuntu22.04安装全过程以及安装后的配置

文章目录 0 背景0.1 电脑配置0.2 电脑磁盘的初始情况 1 准备空闲的磁盘1.1 文件整理1.2 压缩卷和扩展卷的操作 2 准备系统启动盘3 设置电脑的模式&#xff08;未验证&#xff09;并进入Ubuntu安装4 安装Ubuntu5 Ubuntu的配置6 其他 0 背景 之前一直在虚拟机上使用Ubuntu系统&am…

CentOS 5/6/7 基于开源项目制作openssh 9.6p1 rpm包—— 筑梦之路

背景介绍 开源项目地址&#xff1a;https://github.com/boypt/openssh-rpms.git 该项目主要支持了centos 5 、6、7版本&#xff0c;针对使用了比较老的操作系统进行openssh安全加固&#xff0c;还是不错的项目&#xff0c;使用简单、一件制作&#xff0c;欢迎大家去支持作者。…

YOLOv5改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…

电影“AI化”已成定局,华为、小米转战入局又将带来什么?

从华为、Pika、小米等联合打造电影工业化实验室、到Pika爆火&#xff0c;再到国内首部AI全流程制作《愚公移山》开机……业内频繁的新动态似乎都在预示着2023年国内电影开始加速进入新的制片阶段&#xff0c;国内AI电影热潮即将来袭。 此时以华为为首的底层技术科技企业加入赛…

openmediavault(OMV) (19)云相册(3)mt-photos

简介 MT Photos是一款为Nas用户量身打造的照片管理系统。通过AI技术,自动将您的照片整理、分类,包括但不限于时间、地点、人物、照片类型。可以在任何支持Docker的系统中运行它。详情可查看mtmt.tech官网,mt-photos是付费订阅使用的,也可以一次性付费永久使用,具体使用mt…

修复Apache httpd中的SSL/TLS 协议信息泄露漏洞(CVE-2016-2183)

漏洞详情如下&#xff1a; 详细描述TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及Triple 3DES存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过S…

记录 | ubuntu源码编译python3.7.3(指定版本)

一、安装依赖包 sudo apt-get install -y make build-essential libssl-dev zlib1g-dev sudo apt-get install -y libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm sudo apt-get install -y libncurses5-dev libncursesw5-dev xz-utils tk-dev 二、从Python网…

node.js express框架开发入门教程

文章目录 前言一、Express 生成器&#xff08;express-generator&#xff09;二、快速安装1.express框架express-generator生成器安装2.使用pug视图引擎创建项目,projectName 为项目名称自定义 三、安装热更新插件 nodemon四、目录结构1. public文件夹2.routes路由其他请求方式…

本地部署生成式AI,选显卡or笔记本电脑?!新款酷睿Ultra举票

来源 | 算力豹 200亿个大模型参数无压力&#xff0c;新一代酷睿Ultra凭什么&#xff1f; 12月14日报道&#xff0c;在大模型军备竞赛如火如荼的今天&#xff0c;真正让AI铺开惠民&#xff0c;那么移动端、PC将成为首选&#xff0c;AI PC或成标配。英特尔今日奉上AI硬件大招&am…

对于c++的总结与思考

笔者觉得好用的学习方法&#xff1a;模板法 1.采用原因&#xff1a;由于刚从c语言面向过程的学习中解脱出来&#xff0c;立即把思路从面向过程转到面向对象肯定不现实&#xff0c;加之全新的复杂语法与操作&#xff0c;着实给新手学习这门语言带来了不小的困难。所以&#xff…

搞定Apache Superset

踩雷了无数次终于解决了Superset的一系列问题 现在是北京时间2023年12月27日&#xff0c;亲测有效。 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff…

<软考高项备考>《论文专题 - 32 成本管理(5) 》

6 收尾-经验教训 6.1 经验 1、做好计划&#xff0c;项目成本管理和我们的日常开支管理一样&#xff0c;如果不做好计划&#xff0c;很容易造成成本失控&#xff0c;最后是钱花光了&#xff0c;活没干完 2、要有冗余思想&#xff0c;受成本预算和实际之间的偏差以及项目中必不…

Postman常见问题及解决方法

1、网络连接问题 如果Postman无法发送请求或接收响应&#xff0c;可以尝试以下操作&#xff1a; 检查网络连接是否正常&#xff0c;包括检查网络设置、代理设置等。 确认请求的URL是否正确&#xff0c;并检查是否使用了正确的HTTP方法&#xff08;例如GET、POST、PUT等&#…

HBase 例行灾备方案:快照备份与还原演练

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Oracle 12c rac 搭建 dg

环境 rac 环境 &#xff08;主&#xff09;byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;…

算法——哈希表

哈希表简介 **是什么&#xff1a;**存储数据的容器有什么用&#xff1a;快速查找某个元素&#xff0c;时间复杂度O(1)&#xff0c;空间复杂度O(n)**什么时候使用哈希表&#xff1a;**频繁查找某一个数&#xff08;这里不要忘了之前的二分&#xff0c;时间复杂度O(logN)&#x…

论文阅读:Large Language Models Are Zero-Shot Time Series Forecasters(2023NIPS)

摘要 文章涉及了两个时间序列的任务&#xff1a;forecasting&#xff0c;imputation. 对于预测任务&#xff1a;通过将时间序列编码为一系列数字&#xff0c;可以将时间序列预测任务转化为文本里面的next-token预测任务。在大规模预训练语言模型的基础上&#xff0c;文章提出了…