【C语言】学数据结构前必学的结构体struct详细

news2024/9/24 17:15:23

佛祖说,他可以满足程序猿一个愿望。程序猿许愿有生之年写出一个没有bug的程序,然后他得到了永生。


目录

1、结构体的声明与定义

1.1结构体是什么?

1.2为什么要有结构?

1.3结构体的声明

1.4结构体成员类型

1.5结构体变量定义和初始化

2、结构体成员的访问

3、结构体传参


前言:

大家好,我是拳击哥,今天我给大家带来的学数据结构前必学的结构体。本期讲解初始化结构体,如何访问结构体成员以及结构体的传值调用和传址调用。下面我就来讲解它们的用法。


1、结构体的声明与定义

1.1结构体是什么?

什么是结构,我们在学习数组的时候知道了数组是一组相同类型元素的集合,那么数组就是一个结构。而结构体的结构是一些不同类型数据的集合,这些数据称为成员变量。结构的每个成员可以不同类型的变量。


1.2为什么要有结构?

我们生活有很多复杂对象,比如一个人、一本书。一个人他由有姓名,性别,年龄,工资,籍贯来描述。一本书它由书名、作者、出版社、价格来描述。因此这些描述组成复杂对象就是结构。好了说了那么多,如何用代码的形式描述这些复杂对象?请往下看。


1.3结构体的声明

struct stu
{
	type member1;
	type member2;
	type member3;
	...;
}variavle-list;

上述代码中struct是结构体的类型,stu是标签名根据需求起的一个名称。type是结构体类型member是结构体成员我们可以看到可以有N个成员根据你需求来决定有多少个成员变量。

那么{}里面的所有的成员我们成为member-list也就是成员列表,variable-list是变量列表。有了以上概念的理解,1.2中说到了一个人有姓名,性别,年龄,工资,籍贯。假设要描述一个学生如何做呢,我们来看代码:

#include<stdio.h>

struct Person
{
	//以下五个是结体成员
	char name[10];
	int age;
	char sex[5];
	float salary;
	char place[10];
}s4,s5;//声明的同时定义s4,s5
int main()
{
	struct Person s1, s2, s3;//s1-s3是结构体变量(局部的)
	return 0;
}

main函数上方的struct Person以及{}里面的内容都是结构体的声明,声明了结构体成员的类型以及大小。{}后面定义的s3,s4是全局的结构体变量。main函数里面定义的s1,s2,s3这三个是局部结构体变量。只有创建了这五个变量,才会在内存中开辟五块块空间。这五个结构体变量里面存的就是刚刚结构体声明里面的五个结构体成员。


1.4结构体成员类型

那么结构体的是一组不同类型的数组的集合,结构体的成员可以是变量、数组、指针、甚至是棋类结构体。下面我们用代码来讲解。


1.5结构体变量定义和初始化

1.3中我们定了5个结构体变量,我们看到有三种定义方式。这些定义都是有了结构体类型,才能进行定义的。实际上有三种定义方式:

  • 声明类型的同时,在;前面定义全局的结构体变量
  • 单独定义结构体变量
  • main函数里面定义局部的结构体变量

我们来看一组代码:

#include<stdio.h>

struct Person
{
	//以下五个是结体成员
	char name[10];
	int age;
	char sex[5];
	float salary;
	char place[10];
}s4,s5;//声明的同时定义s4,s5

struct Person s6;

int main()
{
	struct Person s1, s2, s3;//s1-s3是结构体变量(局部的)
	return 0;
}

以上代码中,s4,s5属于声明结构体类型的同时在;前面定义全局的结构体变量

s6属于单独定义的结构体变量;s1-s2属于在main函数里面定义局部的结构体变量。

相信大家都已经理解了结构体变量的定义,下面我们来看结构体变量的初始化。


初始化结构体变量。跟数组初始化类似,只不过。结构体变量里面的值可以为不同类型,如以下程序:

#include<stdio.h>

struct Person
{
	char name[10];
	int age;
	char sex[5];
	float salary;
	char place[10];
};

int main()
{
	struct Person s1 = { "张三",22,"男",12.3f,"美国" };
	struct Person s2 = { "李四",23,"女",66.2f,"荷兰" };
	struct Person s3 = { "王五",66,"保密",0.2f,"布吉岛" };
	printf("%s %d %s %.1f %s\n", s1.name, s1.age, s1.sex, s1.salary, s1.place);
	printf("%s %d %s %.1f %s\n", s2.name, s2.age, s2.sex, s2.salary, s2.place);
	printf("%s %d %s %.1f %s\n", s3.name, s3.age, s3.sex, s3.salary, s3.place);
	return 0;
}

输出结果

张三 22 男 12.3 美国
李四 23 女 66.2 荷兰
王五 66 保密 0.2 布吉岛

当我们想访问结构体成员时,我们用结构体变量 号结构体成员来获取。注意,你初始化什么类型格式符就写什么类型比如"张三"对应的格式符为%s,相信大家已经知道怎样初始化结构体变量了。

总结:

  • 结构体成员类型可以是不同的类型,普通数据类型,数组,指针,甚至是结构体
  • 结构体体变量初始化时,对应着结构体成员类型来初始化
  • 结构体变量访问结构体成员时用.操作符来访问
  • 输出每个结构体成员时应该对应该类型的格式符

最后我们来看一下当结构体成员是结构体时是什么样子:

#include<stdio.h>

struct S1
{
	int a;
	char b;
};
struct S2
{
	float c;
	struct S1 f;
	double d;
};
int main()
{
	struct S2 s = { 2.1f,{10,'A'},3.4 };
	printf("%.1f %d %c %.1lf\n", s.c, s.f.a, s.f.b, s.d);
	return 0;
}

 输出结果:2.1 10 A 3.4

structS2中定义了结构体类型为结构体,有些像套娃。下面我来讲解它们的用法:

结构体类型为结构体的结构体成员时初始化只需要在{}里面再加一个{}就好了,{}里面就可以初始化该成员为结构体里面的结构体成员。

结构体变量访问为结构体成员为结构体的结构体成员里面的结构体成员需要用到两个.号 。如上方程序,两个点号来获取。结构体类型为结构体里面的成员。


2、结构体成员的访问

结构体成员的访问相信大家在上面的讲解中已经了解到了一个方法那就通过.号来访问,还有一个方法是通过->来访问。这两个访问方法为:

  • .操作符
  • ->符号
#include<stdio.h>

struct Person
{
	char name[10];
	int age;
	char sex[5];
};

void Print1(struct Person* p)
{
	printf("%s %d %s\n", (*p).name, (*p).age, (*p).sex);
	printf("%s %d %s\n", p->name, p->age, p->sex);
}

int main()
{
	struct Person s = { "张三",60,"男" };
	Print1(&s);
	return 0;
}

输出结果

张三 60 男
张三 60 男

以上代码是把结构体变量s的地址传给了指针结构体变量p。那么我们就可以通过解引用p再访问结构体成员,访问方式就是.号。->号权限比较大可以不用解引用直接访问成员。


 3、结构体传参

在我们学习数组的时候,数组的参数有传值和传参两中传参方式。结构体也是一样,既能传参又能传址。有以下代码:

#include<stdio.h>

struct Person
{
	char name[10];
	int age;
	char sex[5];
};

void Print1(struct Person p1)
{
	printf("%s %d %s\n", p1.name, p1.age, p1.sex);
}

void Print2(struct Person* p2)
{ 
    printf("%s %d %s\n", (*p2).name, (*p2).age, (*p2).sex);
	printf("%s %d %s\n", p2->name, p2->age, p2->sex);
}

int main()
{
	struct Person s = { "张三",60,"男" };
	Print1(s);
	Print2(&s);
	return 0;
}

输出结果

张三 60 男
张三 60 男

张三 60 男

Print1形参里面传过去的就是值,此时p1等同于s。依次通过.号来访问成员变量就好了。

Print2形参里面传过去的就是地址,此时p1的地址等同于s的地址,我们需要先对p1进行解引用才来依次访问成员变量。我们也可以用->直接访问成员变量。


 

本期博客到这里就结束了,相信大家对初识结构体有了新的认识,感谢您的观看。

 Never Give Up

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

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

相关文章

由CPU高负载引发内核探索之旅

导语&#xff1a;STGW&#xff08;腾讯云CLB&#xff09;在腾讯云和自研业务中承担多种网络协议接入、请求加速、流量转发等功能&#xff0c;有着业务数量庞大、接入形式多样、流量规模巨大的特点&#xff0c;给产研团队带来了各种挑战&#xff0c;经常要深入剖析各种疑难杂症。…

Win7纯净版系统镜像64位介绍

Win7系统是一款非常经典的系统&#xff0c;这里想为大家介绍的是Win7纯净版系统镜像64位&#xff0c;主要特点就是非常稳定&#xff0c;运行流畅、占用CPU和内存都非常少。系统非常纯净&#xff0c;使用此系统&#xff0c;可让你的电脑焕然一新&#xff01; 一、系统稳定 1、采…

科普读书会丨《被讨厌的勇气》:愤怒不是目的,是一种工具

Hello&#xff0c; 这里是壹脑云读书圈&#xff0c;我是领读人小美~ 《被讨厌的勇气》读书会目前已经进行了两期&#xff0c;成员们也共同探讨了其中第一夜和第二夜的内容。每个人都有被情绪困扰的时候&#xff0c;而阿德勒心理学告诉我们&#xff0c;即使是负面情绪也不可怕…

WebRTC 服务器搭建篇

First off All 服务器环境&#xff1a;采用的阿里云国内服务器&#xff0c;系统&#xff1a; Ubuntu 16.04 64位 。 各个服务所需要的编译环境图&#xff1a; 各个服务器对应所需编译平台 1.第一步&#xff0c;先更新下命令行工具&#xff0c;工欲善其身必先利其器&#xff…

推荐一款图表功能强大的可视化报表工具

企业信息化建设&#xff0c;大量的数据需要经过分析才能挖掘价值。因此数据的价值越来越受到大家的重视&#xff0c;大数据分析工具逐渐成为企业运营必不可少的辅助工具。俗话说工人要想做好事&#xff0c;首先要磨利工具&#xff0c;拥有一个好用的大数据分析工具尤为重要&…

numpy生成0和1数组方法、从已有数组生成新数组方法、生成固定范围内数组、生成随机数组、绘制指定均值和标准差正态分布图、均匀分布图绘制

一、生成0和1数组 np.ones(shape, dtype)&#xff1a;shape为要生成的数组的维度&#xff0c;dtype为数组内元素类型np.ones_like(a, dtype)&#xff1a;生成与a同维度的数组np.zeros(shape, dtype)np.zeros_like(a, dtype) 代码如下 one np.ones([3,4]) one --------------…

机器学习——支持向量机与集成学习

支持向量机与集成学习 文章目录支持向量机与集成学习支持向量机的基本原理线性可分支持向量常用核函数集成学习概述集成学习的两种方式集成学习的基本类型弱学习其合成方式AdaBoost算法训练过程简例一类按监督学习方式对数据进行二元分类的广义线性分类器 文章目录支持向量机与…

免费不限时长的语音转文字软件——Word365

适用场景 想将语音转化成文字。 这里的语音可以是实时输入&#xff0c;也可以是已有音、视频转换成文字。 后者的操作比前者多一步操作。 1.实时语音转文字 可以直接打开Word365&#xff0c;【开始】选项卡中的【听写】功能。 打开前修改一下设置&#xff0c;语言可以根据需…

nmap之nse脚本简单学习

nmap之nse脚本简单学习 环境&#xff1a;centos8 nmap安装 yum -y install nmap -- 版本 [rootqingchen /]# nmap -version Nmap version 7.70 ( https://nmap.org )脚本入门学习 cd /usr/share/nmap [rootqingchen nmap]# ls nmap.dtd nmap-mac-prefixes nmap-os-db …

300dpi等于多少分辨率?如何给图片修改分辨率大小?

​图片是我们在生活中经常需要接触使用到的东西&#xff0c;无论是工作中还是生活中都离不开图片&#xff0c;在使用图片时我们会接触到“图片分辨率”、“dpi”这个概念&#xff0c;那么到底什么是图片分辨率&#xff1f;300DPI等于多少分辨率&#xff1f;如何给图片修改分辨率…

Lidar和IMU(INS)外参标定----常用开源项目总结

写在前面&#xff1a;博主主要关注的是自动驾驶中Lidar和RTK组合导航设备的标定&#xff0c;大部分的开源项目都把其转化为Lidar和IMU的标定过程。 1. ETH的lidar_align (Github)A simple method for finding the extrinsic calibration between a 3D lidar and a 6-dof pose …

推特精准客户开发手册

你要在巷子里营造出热闹的气氛&#xff0c;人为把热度炒起来&#xff0c;虚假的繁荣是做给别人看的&#xff0c;是用来吸引别人而不是说你自己沉迷于此&#xff0c;而“虚假的繁荣”又是个怎么的虚法呢&#xff1f;它需要外界看起来是真的。 可是问题来了&#xff0c;我们都知…

NTP时钟系统为制造业信息化产业提供守时保障

随着科学技术的发展&#xff0c;工业信息化高速迈进&#xff0c;高精度的同步时钟系统显得尤为重要。利用网络同步时钟系统技术对各个设备之间进行时间统一&#xff0c;对制造业和信息化产业提高产能&#xff0c;让生产力更高效提供守时保障。NTP时钟系统是基于网络时间协议而衍…

你问我答 | 解决关于入托的8个疑问

很多新手家长对于送孩子入托有很多顾虑&#xff0c;这次我们通过“你问我答”让家长更了解托班的意义。 Q&#xff1a;不好好吃饭的小宝宝&#xff0c;适合入托吗&#xff1f; A&#xff1a;适合。吃饭是孩子生活能力培养的重要部分&#xff0c;大部分孩子在入托前&#xff0c…

C. Binary String(思维+贪心)

Problem - 1680C - Codeforces 给你一个由字符0和/或1组成的字符串s。 你必须从字符串的开头去除几个&#xff08;可能是零&#xff09;字符&#xff0c;然后从字符串的结尾去除几个&#xff08;可能是零&#xff09;字符。移除后&#xff0c;字符串可能会变成空的。删除的代价…

【跟学C++】C++STL标准模板库——算法详细整理(中)(Study18)

文章目录1、简介2、STL算法分类及常用函数2.1、变序算法(一)2.2.1 初始化算法(2个)2.2.2 修改算法(2个)2.2.3 复制算法(6个)2.2.4 删除算法(6个)3、总结 【说明】 大家好&#xff0c;本专栏主要是跟学C内容&#xff0c;自己学习了这位博主【 AI菌】的【C21天养成计划】&#x…

大学生静态HTML网页设计--公司官网首页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#xf…

容器服务 ACK 结合 MSE Ingress,让集群入口流量管理更丰富、更容易

作者&#xff1a;扬少 随着云原生技术不断普及&#xff0c;越来越多的业务应用开始向云原生架构转变&#xff0c;借助容器管理平台 Kubernetes 的不可变基础设施、弹性扩缩容和高扩展性&#xff0c;助力业务迅速完成数字化转型。其中&#xff0c;集群入口流量管理方式在云原生…

斐波那契数列、跳台阶、矩形覆盖、而进制中1的个数、判断是否是素数

文章目录1、斐波那契数列2、跳台阶3、矩形覆盖4、二进制中1的个数5、判断是否是素数1、斐波那契数列 本题考点&#xff1a; 间复杂度&#xff0c;fib理解&#xff0c;剪枝重复计算 牛客链接 题目描述&#xff1a; 解题思路&#xff1a; 代码&#xff1a; class Solution {…

ozon、Joom等俄罗斯跨境电商卖家想要爆单需要具备哪些条件—自养号测评

Ozon成立于1998年&#xff0c;目前不仅是俄罗斯多品类电子商务平台领导者、俄罗斯最知名的电子商务品牌&#xff0c;是俄罗斯最早的电子商务公司之一 Joom平台是俄罗斯知名的电商平台&#xff0c;Joom平台成立于2016年6月份&#xff0c;joom平台在16年11月份就对中国地区卖家进…