c语言结构体学习上篇

news2024/11/19 14:29:51

文章目录

  • 前言
  • 一、结构体的声明
    • 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是指针变量,我们就不能用点操作符来访问结构体成员了我们得用箭头操作符来访问找到指针结构体成员。如上面代码所示,我们运行后还是正确的结果。

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

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

相关文章

安卓在SOA中的运用

安卓在运用SOA研发的过程中&#xff0c;会针对实际情况对研发的架构和流程进行优化&#xff0c;通过优化过的架构和实施方案&#xff0c;不仅可以大大提升了整车开发的效率和灵活行以及功能落地的稳定性&#xff0c;同时也增加了系统的向上兼容性。 目前基于车载SOA系统的研发…

在实际电路中的二极管

常见有静电保护用的TVS&#xff0c;电源DC-DC上用的续流二极管&#xff0c;稳压管&#xff0c;发光LED二极管等 本文概要&#xff1a; 0. 二极管识图1. TVS二极管2. 整流二极管3. 稳压二极管4. 肖特基二极管5. 快回复二极管6. 续流二极管7. 发光二极管8. 变容二极管9. 小结一…

QT----Visual Studio添加QT Multimedia报错未找到

问题描述 引入QSound头文件报错&#xff0c;需要添加multimedia模块。项目–QT project settings–QTmodules&#xff0c;添加上multimedia。但是6.4的qt添加完成后全报错了&#xff0c;且6.4已经把sound删了。 问题解决 其实是安装qt的时候没有把Multimedia这个模块装上 打开…

视频融合云平台/智慧监控平台EassyCVR告警警告出错是什么原因?该如何解决?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

基于SSM+Jsp的在线商城系统(有文档演示视频,java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

vue保姆级教程----深入了解Vuex的工作原理

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

HTML----JavaScript操作对象BOM对象

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型概述 BOM&#xff08;浏览器对象模型&#xff09;是JavaScript中的一个重要概念&#xff0c;它提供了一组用于控制浏览器窗口和页面内容的…

通过IP地址防范钓鱼网站诈骗的有效措施

随着互联网的普及&#xff0c;钓鱼网站诈骗成为一种广泛存在的网络犯罪行为。通过冒充合法网站&#xff0c;攻击者试图窃取用户的敏感信息。本文将探讨如何通过IP地址防范钓鱼网站诈骗&#xff0c;提供一系列有效的措施&#xff0c;以加强网络安全&#xff0c;保护用户免受诈骗…

逻辑回归算法到底能做什么

逻辑回归&#xff08;Logistic Regression&#xff09;是一种广义的线性回归分析模型&#xff0c;常用于数据挖掘、疾病自动诊断、经济预测等领域。它根据给定的自变量数据集来估计事件的发生概率。变量的范围在0和1之间&#xff0c;通常用于二分类问题&#xff0c;最终输出的预…

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面&#xff08;GUI&#xff09;框架。它是Java平台的一部分&#xff0c;从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能&#xff0c;使开发人员能够创建具有吸引力和交互性的应用程…

【Proteus仿真】【Arduino单片机】数控稳压可调电源设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用动态数码管、按键、PCF8591 AD/DAC、LM358放大电路模块等。 主要功能&#xff1a; 系统运行后&#xff0c;系统默认输出直流5V&#xff0c;数…

C#使用 OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率相关方式

C# 去获取电脑相关的基础信息&#xff0c;还是需要借助 外部的库&#xff0c;我这边尝试了自己去实现它 网上有一些信息&#xff0c;但不太完整&#xff0c;都比较零碎&#xff0c;这边尽量将代码完整的去展示出来 OpenHardwareMonitor获取CPU的温度和频率需要管理员权限 在没…

第十二章 需求工程之一图胜千言

需求建模 可视化需求模型能帮助我们识别被遗漏的、不相关的和不一致的需求。数据流图&#xff08;DFD&#xff09;流程图&#xff0c;如泳道图状态转换图&#xff08;STD&#xff09;和状态表对话图决策表和决策树事件-响应表需求树用例图活动图实体关系图&#xff08;ERD&…

Win10升级到Win11

Win10升级到Win11 1. 下载PC健康状况检查应用2. 下载Win111. Windows 11 安装助手2. 创建Windows 11 安装3. 下载Windows 11 磁盘映像&#xff08;ISO&#xff09; 3. Windows 11 安装助手4. 安装成功 有些小伙伴的诉求是想使用一下当前最火的Win11操作系统怎么样。 这里就来安…

Java基础进阶(学习笔记)

注&#xff1a;本篇的代码和PPT图片来源于黑马程序员&#xff0c;本篇仅为学习笔记 static static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 修饰成员的特点&#xff1a; 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述&#xff1a;加电后bios程序会自检硬件&#xff0c;硬件无故障&#xff0c;会根据第一启动项去找内核&#xff0c;一般来说&#xff0c;第一启动项是硬盘&a…

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的&#xff0c;共有734份文件&#xff0c;包括PDF&#xff0c;PPT&#xff0c;表格&#xff0c;图片&#xff0c;音频等多种格式&#xff0c;可以作为初级日语的学习教材&#xff0c;也是非常适合初学者入门的&#xff0c;可以帮助大家快速的…

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索和广度优先搜索&#xff0c;都是图形搜索算法&#xff0c;它两相似&#xff0c;又却不同&#xff0c;在应用上也被用到不同的地方。这里拿一起讨论&#xff0c;方便比较。 一、深度优先搜索 深度优先搜索属于图算法的一种&#xff0c;是一个针对图和树的遍历算法&…

西城微科|充气泵方案PCBA和芯片

智能充气泵是一种常见的充气工具&#xff0c;它在我们的日常生活中扮演着重要的角色。它主要用于给车辆、自行车、橡皮艇、游泳圈等充气&#xff0c;方便人们在各种场合使用。它简单方便的操作&#xff0c;快速高效的充气速度&#xff0c;以及便携的设计&#xff0c;让我们能够…

ubuntu系统没有网络图标的解决办法

参考文章:https://blog.csdn.net/qq_56922632/article/details/132309643 1. 执行关闭网络服务的命令&#xff0c;关闭网络服务sudo service NetworkManager stop2. 删除网络的状态文件sudo rm /var/lib/NetworkManager/NetworkManager.state3. 修改网络的配置文件sudo vi /etc…