【初阶C语言】学会结构体

1.结构体类型的声明
2.结构体初始化
3.结构体成员访问
4.结构体传参
 


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

一、结构体类型的声明

1.结构的声明

结构体声明的模板:

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

    这是一个模板的声明,得出来的结构体只是一种类型,与int char一样。

例如,我们需要描述一个学生的信息,能用int类型来描述学生吗?显然是不行的,因为学生包括了学号(char),名字(char),年龄(int)和性别(char),所以这不是一个单一的类型,就需要用到结构体来描述该学生。

第一种声明方式:这个结构体的全名为:strcut Stu

struct Stu
{
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
};//这里的分号不能丢

第二种方式:重命名

typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//给结构体类型重新取名为Stu

重新命名的方式还可以这样:

struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
typedef struct Stu Stu;//重新起一行来命名

第三种方式:在声明的时候创造变量

struct Stu
{
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
}S1;//这里的S1是结构体创造出来的全局变量

 上面一系列的操作都只是对一个结构体类型进行了声明而已,更多内容尽在后面。

2.结构体成员的类型

前言:在上面的模板我们可以知道,member_list是结构体成员,那结构体成员的类型可以是哪些呢?

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

struct A 
{
	char c;
	int a;
}; ​
struct B
{
	char b;
	int arr[10];
	struct A c;//成员为其他结构体成员
	struct A* F;//为指针类型
};

但是需要注意的是,结构体成员不可以是本身的结构体,但是可以是本身结构体指针。

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

在前面的时候,我们有介绍过在声明的时候创造的全局变量,接下来都一起介绍了。

第一种创造方式:

#include<stdio.h>
struct Stu
{
	char c;
	int arr[10];
};
int main()
{
	struct Stu A;//结构体变量A
	struct Stu B;//结构体变量B
	return 0;
}

这里创造的变量A和B都是局部变量。

第二种创造方式:

#include<stdio.h>
typedef struct Stu
{
	char c;
	int arr[10];
}Stu;//对结构体重命名
int main()
{
	//struct Stu A;//结构体变量A
	//struct Stu B;//结构体变量B
	Stu C;//结构体变量C
	return 0;
}

第三种方式:上面提到过的创造全局变量

#include<stdio.h>
struct Stu
{
	char c;
	int arr[10];
}D;//全局变量D
int main()
{
	//struct Stu A;//结构体变量A
	//struct Stu B;//结构体变量B
	//Stu C;//结构体变量C
	return 0;
}

在创建后变量后,就该对变量进行初始化了

初始化:

#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
	double height;
};
int main()
{
	struct Stu s1 = {"zhangsan",20,182.8};//顺序初始化
	struct Stu s2 = {.age=18,.height=188.5};//指定成员初始化
	return 0;
}

在创建变量的时候就初始化:

struct Stu
{
	char name[20];
	int age;
	double height;
}s3 = {"lisi",19,150.6};//创造的全局变量并初始化

二、结构体成员的访问

当完成结构体的声明、结构体变量的创建和初始化后,就可以使用结构体了,这就是涉及到结构体成员访问的知识。

结构体的访问有两个操作符:'.'操作符和'->'操作符

接下来我们通过初始化和打印的两个操作来举例说明结构体成员访问的例子。

#include<stdio.h>
struct Stu
{
	double height;
	int age;
};
void set_s1(struct Stu* ps)//用结构体类型指针接收
{
	ps->age = 22;
	ps->height = 188.45;//用"->"操作符访问结构体成员
}
void print(struct Stu s)
{
	printf("%d %lf",s.age,s.height);
}
int main()
{
	struct Stu s1 = { 0 };//这里先初始化成0
	//用一个函数对结构体变量赋值
	set_s1(&s1);//因为需要修改值,所以必须要传址
	//用一个函数打印结构体变量中的数据
	print(s1);//只需要打印,不需要修改。传值就可以
	return 0;
}

我们看一下运行的结果:

 在上面的例子中,出现了两个操作符,具体什么时候用哪个我们总结一下。(.和->)

结构体变量.成员名        结构体指针->成员名

就是在用指针的时候,左边必须是->,另一个同样的道理。

通过上面的例子我们可以知道,结构体既可以传值,也可以传地址,接下来我们一起看看这两个的差异吧。

1.传参

传参的话,需要重新开辟的空间很会很大,并且有的情况下传值是不能达成要求的,因为形参是实参的一份拷贝

2.传址

传址可以适用于所有的情况,并且所需要重新开辟的内存不大,所以尽可能使用结构体传址的方法。

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

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

相关文章

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

sqlyog导出mysql数据字典

1.打开sqlyog执行sql获取字典数据 SELECTt.COLUMN_NAME AS 字段名,t.COLUMN_TYPE AS 数据类型,CASE IFNULL(t.COLUMN_DEFAULT,Null) WHEN THEN 空字符串 WHEN Null THEN NULL ELSE t.COLUMN_DEFAULT END AS 默认值,CASE t.IS_NULLABLE WHEN YES THEN 是 ELSE 否 END AS 是否…

docker的使用

docker安装 https://docs.docker.com/engine/install/debian/ 设置国内镜像 创建或修改 /etc/docker/daemon.json 文件&#xff0c;修改为如下形式 {"registry-mirrors": ["https://registry.hub.docker.com","http://hub-mirror.c.163.com"…

音频光耦合器

音频光耦合器是一种能够将电信号转换为光信号并进行传输的设备。它通常由发光二极管&#xff08;LED&#xff09;和光敏电阻&#xff08;光电二极管或光敏电阻器&#xff09;组成。 在音频光耦合器中&#xff0c;音频信号经过放大和调节后&#xff0c;被转换为电流信号&#xf…

opencv基础40-礼帽运算(原始图像减去其开运算)cv2.MORPH_TOPHAT

礼帽运算是用原始图像减去其开运算图像的操作。礼帽运算能够获取图像的噪声信息&#xff0c;或者得到比原始图像的边缘更亮的边缘信息。 例如&#xff0c;图 8-22 是一个礼帽运算示例&#xff0c;其中&#xff1a; 左图是原始图像。中间的图是开运算图像。右图是原始图像减开运…

LeetCode 热题 100 JavaScript--543. 二叉树的直径

给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 var diameterOfBinaryTree function(root) {var maxDiameter…

多雷达探测论文阅读笔记:雷达学报 2023, 多雷达协同探测技术研究进展:认知跟踪与资源调度算法

多雷达协同探测技术 原始笔记链接:https://mp.weixin.qq.com/s?__biz=Mzg4MjgxMjgyMg==&mid=2247486627&idx=1&sn=f32c31bfea98b85f2105254a4e64d210&chksm=cf51be5af826374c706f3c9dcd5392e0ed2a5fb31ab20924b7dd38e1b1ae32abe9a48afa8174#rd ↑ \uparrow …

视频过大如何压缩变小?文件压缩技巧分享

如何压缩视频是许多视频编辑者、视频上传者经常遇到的问题&#xff0c;如果你也遇到了这个问题&#xff0c;不用担心&#xff0c;下面将就给大家分享几个视频压缩方法&#xff0c;可以帮助大家轻松地压缩视频&#xff0c;同时保持视频的高清晰度和音频质量。 一、嗨格式压缩大师…

【Kubernetes】

目录 一、Kubernetes 概述1、K8S 是什么&#xff1f;2、为什么要用 K8S?3、Kubernetes 集群架构与组件 二、核心组件1、Master 组件2、Node 组件3、K8S创建Pod的工作流程&#xff1f;&#xff08;重点&#xff09;4、K8S资源对象&#xff08;重点&#xff09;5、Kubernetes 核…

Java课题笔记~ MyBatis入门

一、ORM框架 当今企业级应用的开发环境中&#xff0c;对象和关系数据是业务实体的两种表现形式。业务实体在内存中表现为对象&#xff0c;在数据库中变现为关系数据。当采用面向对象的方法编写程序时&#xff0c;一旦需要访问数据库&#xff0c;就需要回到关系数据的访问方式&…

偶数科技亮相第十届中国中小企业投融资交易会

第十届中国中小企业投融资交易会暨2023“小企业 大梦想”高峰论坛近日在北京举办。本届大会以“金融活水精准滴灌 专精特新体制增量”为主题&#xff0c;通过展览展示、论坛活动、项目路演、产融对接等形式&#xff0c;搭建了专精特新企业与金融机构之间、与地方政府之间的产融…

虹科活动 | 走进宇通客车-汽车新供应链技术展精彩回顾

引言 7月27日&#xff0c;走进宇通客车-汽车新供应链技术展于宇通研发中心成功举办&#xff0c;本次展会中虹科为大家带来了一体化车载天线与车辆GNSS仿真测试方案&#xff0c;感谢您前来探讨与交流&#xff01; 精彩产品一览 车辆GNSS仿真测试方案 虹科高性能GNSS模拟器具有灵…

Dockerfile构建LNMP镜像

建立工作目录 [rootlocalhost ~]# mkdir lnmp [rootlocalhost ~]# cd lnmp/ 编写Dockerfile文件 [rootlocalhost lnmp]# vim Dockerfile [rootlocalhost lnmp]# ll 总用量 4 -rw-r--r--. 1 root root 774 8月 3 14:54 Dockerfile [rootlocalhost lnmp]# vim Dockerfile #基础…

web前端转正工作总结范文5篇

web前端转正工作总结&#xff08;篇1&#xff09; 来到__有限公司已经三个月了&#xff0c;目前的工作是前端开发&#xff0c;我是一名应届毕业生&#xff0c;之前没有过工作经验&#xff0c;在刚来到__这个大家庭的时候&#xff0c;我就被这里的工作气氛深深地吸引&#xff0…

极狐GitLab 全新「价值流仪表盘」使用指南

本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Haim Snir 译者&#xff1a;极狐(GitLab) 市场部内容团队 GitLab / 极狐GitLab 价值流仪表盘的使用相对简单&#xff0c;这种可以定制化的仪表盘能够让决策者识别数字化转型进程中的趋势及机遇。 如果你已经在用 GitLab…

17、YML配置文件及让springboot启动时加载我们自定义的yml配置文件的几种方式

YML配置文件及加载自定义配置文件的几种方式 ★ YAML配置文件 其实本质和.properties文件的是一样的。 Spring Boot默认使用SnakeYml工具来处理YAML配置文件&#xff0c;SnakeYml工具默认就会被spring-boot-starter导入&#xff0c;因此无需开发者做任何额外配置。 YAML本质…

《Python入门到精通》循环语句 while循环,for循环

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 循环语句 1、语法格式1.1、while1.2、死循环1.3、简写形式 2、continue 跳过循环…

【数据结构练习题】单链表问题解决(虚拟头节点法,递归,快慢指针法)

目录 1.删除单链表中的元素1.1 删除排序链表中的重复元素1.2 删除排序链表中的重复元素Ⅱ1.3 移除链表元素 2.反转链表2.1 反转链表2.2 反转链表Ⅱ 3.查找链表中结点3.1 链表的中间结点3.2 链表中倒数第k个节点 4.回文链表5.相交链表6.合并链表 知识补充&#xff1a; 递归三要素…

【GITHUB】FlipIt – Windows的开源翻页时钟

FlipIt 是一款免费开源的翻页时钟应用&#xff0c;专为 Windows 平台设计。该应用灵感来源于备受喜爱的老牌翻页时钟应用 Fliqlo&#xff0c;后者被公认为经典的翻页时钟屏保。然而&#xff0c;由于 Fliqlo 是基于 Flash 技术开发的&#xff0c;随着微软最近正式禁用 Flash&…

非凸科技受邀参加中科大线上量化分享

7月30日&#xff0c;非凸科技受邀参加由中国科学技术大学管理学院学生会、超级量化共同组织的“打开量化私募的黑箱”线上活动&#xff0c;分享量化前沿以及求职经验&#xff0c;助力同学们拿到心仪的offer。 活动上&#xff0c;非凸科技量化策略负责人陆一洲从多个角度分享了如…