c语言结构体学习

文章目录

  • 前言
  • 一、结构体的声明
    • 1,什么叫结构体?
    • 2,结构体的类型
    • 3,结构体变量的创建和初始化
    • 4,结构体的类型
    • 5,结构体的初始化
  • 二、结构体的访问
    • 1,结构体成员的点操作符访问
    • 2,结构体体成员的指针访问
  • 三、结构体传参


前言

昨天就是新的一年,小编看到了一句话送给各位读者:在过去的一年里,也许你踏足山巅,拥有团花锦簇的风光,也许你进入了低谷,经历了一个人的兵荒马乱,但是没关系的,去年千般未如愿,今年万事定称心。把过去的事儿,过去的人,一块尘封在记忆中不再烦恼,不再怀念。岁月本无语,未来犹可期,我始终如少年,你始终如初见。新的一年,我们看到了盛世的烟火,看到了繁华的街景,在c语言中写出烟花的代码可不是一个简单的小事情,他需要不断的积累,接下来我们学习结构体,在后面小编会给大家讲一些小的c游戏,烟花就需要用到结构体哦!


提示:以下是本篇文章正文内容,下面案例可供参考

一、结构体的声明

1,什么叫结构体?

结构就是一种集合
1,在之前我们学过很多数据类型,但是这些类型是内置类型,能描述的对象是非常有限的
2,但是生活中存在许多复杂对象,复杂对象就是不能用单一的数据去描述的,这时候为了方便描述复杂对象,于是c语言就有了结构体的概念
3,相比于结构体,数组是一组相同类型元素的集合,而结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同的类型

分析

就比如:我们划分一个人的特征
首先是性别,性别为男/女 ,我们存储这个性别用的类型为字符类型
再次是年龄,年龄肯定是正整数,我们定义一个有符号类型的整数来给年龄
然后是身高,身高是一个有小数点的数,所以我们这里可以用浮点型来定义身高
还有很多,在这里我们把人的特征集合在一起这个就是结构,然后这些特征被称为成员变量,每个成员
的变量类型可以相同可以不同

2,结构体的类型

语法形式

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

例如:

//人的结构体类型声明
struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char   sex[5];   //性别
}p1,p2;
int main()
{

	return 0;
}
分析

在这里tag就是结构体的标签,也就是要描述的东西,也就是复杂对象像上面的例子中的人;member-list是成员列表,在这里面声明成员类型,也就是定义变量,如上方例子中的年龄,性别,身高等;variable-list变量列表,就是我们用上面这个类型来创建变量,这里肯定会有疑惑的,比如int x = 0;这后面是不是有一个分号,然后我们不初始化就是int x;所以简单的来说:也就是说前面的内容都是结构体的类型,然后我们o就是结构体类型的变量。在上面代码中我们创建了两个结构体变量p1和p2.在这里p1和p2是全局变量。而我们在定义变量的时候要尽量用局部变量所以我们需要继续往后学习结构体的变量的创建

3,结构体变量的创建和初始化

在上面我们是在main函数外面声明的全局变量,接下来我们学习结构体的变量创建

struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char sex[5];   //性别
};
int main()
{
	struct people p1 = { 0 };//结构体的局部变量
	return 0;
}
}
分析
在这里我们要区分一下结构体的类型是什么,结构体变量是什么,然后在上面你想给变量进行初始化就给他按照上面顺序类型给他赋值,用逗号隔开,不想初始化值,就局部初始全为0;注意这里和数组差不多一样的里面的成员很多,用大括号括起来。

在这里插入图片描述

4,结构体的类型

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

struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char sex[5];   //性别
};
struct team
{
	struct people p;
	int num;
	int class;
};
int main()
{
	struct people p1 = { 0 };//结构体的局部变量
	return 0;
}
分析

在这里我们又创建了一个小组成员的结构体变量,在结构体变量里面我们定义了结构体people类型的变{}量p1,数量,和组别。这里是结构体内使用其他结构体。

5,结构体的初始化

struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char sex[5];   //性别
};
struct team
{
	struct people p;
	int num;
	char class[5];
};
int main()
{
	//struct people p1 = { 0 };//结构体的局部变量
	struct people p1 = { "张三",20,175,"男" };
	struct team t = { {"张三",20,175,"男"} ,1,"经理" };
	return 0;
}

在这里插入图片描述

分析
然后在上面你想给变量进行初始化就给他按照上面顺序一一对应类别给他赋值,用逗号隔开,不想初始化值,就局部初始全为0;注意这里和数组差不多一样的里面的成员很多,用大括号括起来。然后结构体嵌套就在里面在加一个大括号描述另一个结构体内的成员就可以。如上方代码。打开监视窗口我们也可以发现它里面的存储情况和我们想的是一样的。如果不是一一对应的话他所赋值给的值不能给到相应的元素。然后出现下面这种情况。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/042756740f48458c9a9d9b3a8ff7a760.png)

二、结构体的访问

1,结构体成员的点操作符访问

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,结构体变量.结构体成员

     <table><tr><td bgcolor=turquoise>分析  </td></tr></table>

在上面我们只是通过监视窗口来查看结构体内的成员,我们可以将他打印出来么接下来就要用到结构体的访问,也就是我们之前学习的操作符内的结构体操作符,结构体操作符详见小编所写的详解c语言操作符(下篇)

struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char sex[5];   //性别
};
struct team
{
	struct people p;
	int num;
	char class[5];
};
int main()
{
	//struct people p1 = { 0 };//结构体的局部变量
	struct people p1 = { "张三",20,175,"男" };
	struct team t = { {"张三",20,175,"男"} ,1,"经理" };
	printf("%s %d %d %s\n",p1.name,p1.age,p1.height,p1.sex);
	printf("%s %d %d %s %d %s", t.p.name, t.p.age, t.p.height, t.p.sex,t.num,t.class);

	return 0;
}

在这里插入图片描述

分析

在这里,成员是内置类型不是指针,所以我们用变量名点成员来访问成员元素。

2,结构体体成员的指针访问

struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char sex[5];   //性别
};
struct team
{
	struct people p;
	int num;
	char class[5];
};
void print(struct people* p)
{
	printf("%s %d %d %s\n", p->name, p->age, p->height, p->sex);
}
int main()
{
	//struct people p1 = { 0 };//结构体的局部变量
	struct people p1 = { "张三",20,175,"男" };
	struct team t = { {"张三",20,175,"男"} ,1,"经理" };
	//printf("%s %d %d %s\n",p1.name,p1.age,p1.height,p1.sex);
	//printf("%s %d %d %s %d %s", t.p.name, t.p.age, t.p.height, t.p.sex,t.num,t.class);

	print(&p1);
	return 0;
}

在这里插入图片描述

分析
在这里我们把之前的打印注释掉,然后我们创建一个print函数来打印结构体变量p1,在这里我们对他进行取地址,然后接受的就是结构体指针变量,在print函数里面打印结构体变量p1的成员,这时候的变量p是指针变量,我们就不能用点操作符来访问结构体成员了我们得用箭头操作符来访问找到指针结构体成员。如上面代码所示,我们运行后还是正确的结果。

三、结构体传参

结构体传参其实我们在上面结构体的访问中就已经详细的说了,但是刚才是举例说明结构体的两种访问形式,显而易见,结构体传参也有两种传参形式,一种是直接将结构体变量本身传参,另一种则是传结构体的地址。

struct people
{
	char name[20]; //名字
	int age;       //年龄
	int height;    //身高
	char sex[5];   //性别
};
struct team
{
	struct people p;
	int num;
	char class[5];
};
void print1(struct people p)
{
	printf("%s %d %d %s\n", p.name, p.age, p.height, p.sex);  //结构体变量.成员变量
}
void print(struct people* p)
{
	printf("%s %d %d %s\n", p->name, p->age, p->height, p->sex);  //结构体指针 -> 成员变量
}
int main()
{
	//struct people p1 = { 0 };//结构体的局部变量
	struct people p1 = { "张三",20,175,"男" };
	struct team t = { {"张三",20,175,"男"} ,1,"经理" };
	printf("%s %d %d %s\n",p1.name,p1.age,p1.height,p1.sex);  
	printf("%s %d %d %s %d %s\n", t.p.name, t.p.age, t.p.height, t.p.sex,t.num,t.class);

	print1(p1);
	print(&p1);
	return 0;
}
分析

在这里print1中传参传递的就是结构体变量本身,print则是转递的是结构体的指针,将结构体变量的地址取出来传给print函数。在这里我们想让print1和print都打印p1的数据,而我们两个传参方式都做到了,达到了同样的效果,在这里我们看到p1如下图:在这里p1传参给p,也就是实参传参给形参,在之前函数的时候小编就说了,当实参传给形参时,形参就是实参的一份临时拷贝,所以我们在打印p的时候就是在打印p1的数据,但是,结构体传参把对象进行传参,是不是先拷贝在给他,如果结构体内成员多,这时候浪费的时间就多,在者进行对象传参,如果结构体成员多,那么我们需要开辟的空间也就越多,造成了空间浪费。
在这里插入图片描述

而在这里我们把p1的地址传过去,而指针大小无非就是四个字节或者八个字节,相对于把对象传参不用花费太多时间占用太大内存,而我们形参接受指针地址,后面也可以直接通过地址找到p1中的对象。
在这里插入图片描述

结论
函数传参的时候,参数需要压栈,如果传递一个结构体对象的时候结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。**因此,在结构体传参的时候,我们建议用指针传参的方式进行传参。**

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络连接 UDP2,UDP Connect, bind, send, recieve认知, -入门8

LWIP编程接口有RAW, NETCONN, SOCKET 2.UDP函数的理解 #define UDP_SERVER_PORT 8000 //PC side #define UDP_CLIENT_PORT 1234 // ctrl board side //PC IP address #define DEST_IP_ADDR0 192 #define DEST_IP_ADDR1 168 #define DEST_IP_ADDR2 3 #define DEST_IP_ADDR3 11…

如何安装和使用夜神模拟器连接Android Studio

目录 简介 一、安装 二、使用 三、更多资源 简介 夜神模拟器是一款在Windows平台上运行的Android模拟器软件。它能够模拟Android操作系统环境&#xff0c;让用户在电脑上轻松体验Android应用程序。夜神模拟器的功能强大&#xff0c;可以满足各种需求&#xff0c;无论是娱乐…

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …

大模型学习第一课

学习目标&#xff1a; 大模型开源体系 学习内容&#xff1a; 大模型简述大模型性能开源体系 学习时间&#xff1a; 周四上午 10点 学习记录&#xff1a; 大模型简述 大模型是发展通用人工智能的重要途经专用模型到通用大模型实验室开源历程&#xff0c;大模型系列7B-20B-12…

k8s实践(14)--scheduler调度器和pod调度策略

一、scheduler调度器 1、kube-scheduler简介 k8s实践(10) -- Kubernetes集群运行原理详解 介绍过kube-scheduler。 kube-scheduler是运行在master节点上&#xff0c;其主要作用是负责资源的调度&#xff08;Pod调度&#xff09;&#xff0c;通过API Server的Watch接口监听新建…

C++中的new和delete

相关文章 C智能指针 文章目录 相关文章前言一、new 运算符1. operator new 函数的范围2. 在类中重载new运算符3. 分配失败 二、delete 运算符1. 内存泄露统计示例2. 在类中重载delete运算符 总结 前言 在C中&#xff0c;new和delete是用于动态内存管理的运算符&#xff0c;它们…

Halcon计算一个区域的最大内接圆 inner_circle

Halcon计算一个区域的最大内接圆 该算子用于计算一个区域的最大内接圆&#xff0c;其原型如下&#xff1a; inner_circle(Regions : :: Row, Column, Radius)参数1&#xff1a;Regions 表示输入的区域。 参数2和3&#xff1a;Row、Column为输出参数&#xff0c;表示最大内接圆…

面试经典题---6.Z字形变换

6.Z字形变换 我的解法&#xff1a; 首先定义了3个变量&#xff1a;index、add和step。 index&#xff1a;当前处理字符在原字符串中的下标&#xff1b;add&#xff1a;Z字形中相邻两个字符在原字符串中的下标之差&#xff08;非固定值&#xff0c;值随着行的改变会发生变化&am…

Linux 上 Nginx 配置访问 web 服务器及配置 https 访问配置过程记录

目录 一、前言说明二、配置思路三、开始修改配置四、结尾 一、前言说明 最近自己搭建了个 Blog 网站&#xff0c;想把网站部署到服务器上面&#xff0c;本文记录一下搭建过程中 Nginx 配置请求转发的过程。 二、配置思路 web项目已经在服务器上面运行起来了&#xff0c;运行的端…

EtherCAT主站SOEM -- 13 --Qt-Soem通过界面按键控制 EtherCAT IO模块的io输出

EtherCAT主站SOEM -- 13 --Qt-Soem通过界面按键控制 EtherCAT IO模块的io输出 一 mainwindow.c 文件函数:1.1 自定义PDO配置2.2 主站初始化2.3 去motrorcontrol界面二 motrorcontrol.c 文件三 allvalue.h 文件该文档修改记录:总结一 mainwindow.c 文件函数: mainwindow主界…

性能分析与调优: Linux 性能分析60秒

目录 一、实验 1.环境 2.Linux性能分析60秒 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192.168…

数据分析基础之《numpy(6)—IO操作与数据处理》

了解即可&#xff0c;用panads 一、numpy读取 1、问题 大多数数据并不是我们自己构造的&#xff0c;而是存在文件当中&#xff0c;需要我们用工具获取 但是numpy其实并不适合用来读取和处理数据&#xff0c;因此我们这里了解相关API&#xff0c;以及numpy不方便的地方即可 2…

java解析json复杂数据的两种思路

文章目录 一、原始需求二、简单分析三、具体实现一1. api接口2. 接口返回3. json 数据解析1.&#xff09;引入Jackson库2.&#xff09;定义实体3.&#xff09;解析json字符串4.&#xff09;运行结果 4. 过程分析 四、具体实现二1. 核心代码2.运行结果 五、方案比较六、源码传送…

python数据可视化之折线图案例讲解

学习完python基础知识点&#xff0c;终于来到了新的模块——数据可视化。 我理解的数据可视化是对大量的数据进行分析以更直观的形式展现出来。 今天我们用python数据可视化来实现一个2023年三大购物平台销售额比重的折线图。 准备工作&#xff1a;我们需要下载用于生成图表的第…

MySQL之视图外连接、内连接和子查询的使用

一、视图 1.1 含义 虚拟表&#xff0c;和普通表一样使用 1.2 操作 创建视图 create view 视图名 as 修改视图 方式一&#xff1a; create or replace view 视图名 as 【查看视图相关字段】 方式二&#xff1a; alter view 视图名 as 【查看的SQL语句】 查看视图 方式一&…

【算法笔记】深入理解dfs(两道dp题)

DFS过程的概述 一个一个节点的搜&#xff0c;如果是树状结构的话&#xff0c;先找到最左边那一条分支搜到最后一个节点&#xff0c;这个时候最后一个节点&#xff08;假设是b&#xff09;的数据会被更新&#xff08;具体看题目的要求&#xff09;&#xff0c;然后返回到上一个…

服务器终端快速下载coco数据集

######解压到当前文件夹 sudo apt-get install aria2 aria2c -c <url> #<url>即为官网下载地址# url # download images http://images.cocodataset.org/zips/train2017.zip http://images.cocodataset.org/zips/val2017.zip# download annotations http://i…

Pytest的测试报告——Allure

一、html-report测试报告 html-report测试报告。是pytest下基本的测试报告。要使用pytest-html测试报告&#xff0c;就要确保python版本在3.6及以上即可。本身pytest所提供的测试结果汇总&#xff0c;是基于控制台的文本输出形式。 pytest-html是基于HTML格式实现的测试报告的…

Spark调优解析-spark数据倾斜优化2(七)

1 数据倾斜优化 1.1为何要处理数据倾斜&#xff08;Data Skew&#xff09; 什么是数据倾斜 对Spark/Hadoop这样的大数据系统来讲&#xff0c;数据量大并不可怕&#xff0c;可怕的是数据倾斜。 何谓数据倾斜&#xff1f;数据倾斜指的是&#xff0c;并行处理的数据集中&#xf…

py的基础语法

前言:本章节主播会详细描述py的基础语法&#xff0c;其中包括语句之间的转换和拼接&#xff0c;内容较多&#xff0c;友友们加油 目录 一.字面量 1.1关于字面量 1.2举例 1.3小结 二.注释 2.1关于注释 2.2举例 2.3小结 三.变量 3.1关于变量 3.2举例 3.3小结 四.数据…