C语言基础之——结构体

前言:小伙伴们又见面啦,那么本篇文章,我们就将对C语言基础知识的最后一个章节——结构体展开讲解。

世上无难事,只要肯攀登!


目录

一.什么是结构体

二.结构体讲解

1.结构体的声明和变量的定义

2.结构体成员的类型

3.结构体变量的初始化

三.结构体成员的访问与传参

 总结


一.什么是结构体

结构体是为了用来描述复杂对象而创建的一种数据类型

结构体是一些值的集合,这些值被称作结构体的成员变量,结构体的每个成员可以是不同类型的变量

那么我们为什么要创造和使用结构体呢???

比如说:当我们要描述一个人时,需要接收这个人的名字、年龄、性别、电话等等,这些信息分别属于不同的数据类型,单单用一种数据类型无法完全描述,所以就出现了结构体这一能够将多个不同数据类型的变量集合起来集合性数据类型

二.结构体讲解

1.结构体的声明和变量的定义

struct name

{

        member-list;

}variable-list;

  • struct是创建一个结构体所必要的关键字,它表示我们要创建一个什么样的结构体类型。
  • name则是这个结构体的类型名字,可以自由选择。
  • member-list是你所需要的成员变量的列表,可以是多个。
  • variable-list是结构体类型的变量列表。

我们来实际创建一个学生类型的结构体:

#include<stdio.h>
struct Student
{//学生的各种属性成员char name[20];//名字是字符串,用数组存放int age;//年龄char sex[5];//性别是字符串,用数组存放int stunum[15];//学号也是一串数字,用数组存放
}s1, s2;//定义变量
int main()
{struct Student s3;//定义变量struct Student s4;//定义变量return 0;
}

学生有姓名、年龄、性别、学号等等属性成员。

s1、s2、s3、s4是我们分别定义的结构体类型的变量。其中s1、s2是全局变量,因为在main函数的外边,s3、s4则是局部变量。

我们看到上边对结构体局部类型变量的创建前边都需要struct来表示,其实我们还有另一种创建方式,不需要用到struct就可以创建局部变量:

#include<stdio.h>
typedef struct Student
{//学生的各种属性成员char name[20];//名字是字符串,用数组存放int age;//年龄char sex[5];//性别是字符串,用数组存放int stunum[15];//学号也是一串数字,用数组存放
}Student;//重命名产生的新类型
int main()
{Student s3;//变量Student s4;//变量struct Student s5;//变量return 0;
}

我们用到了typedef关键字,作用是类型定义。它用在结构体的开头时,我们就可以给结构体类型取一个新的名字,就比如我们结构体末尾的Student,随后就可以用这个新名字来定义变量啦。

当然struct在这样的定义下也是可以继续用的

2.结构体成员的类型

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

struct B
{char s;
};
struct A
{int a;char b;int* p;char arr[20];struct B ab;
};

3.结构体变量的初始化

我们还以学生为例:

#include<stdio.h>
struct Student
{//学生的各种属性成员char name[20];//名字是字符串,用数组存放int age;//年龄char sex[5];//性别是字符串,用数组存放int stunum[15];//学号也是一串数字,用数组存放
};
int main()
{struct Student s1;//定义变量struct Student s1 = { "zhangsan",18,"nan",{2,2,2,8,7,6,0,0,1} };return 0;
}

初始化结构体变量初始化时要用{},我们上述的初始化是按顺序全部初始化的,当然我们也可以不按顺序,来看方法:

struct Student
{//学生的各种属性成员char name[20];//名字是字符串,用数组存放int age;//年龄char sex[5];//性别是字符串,用数组存放int stunum[15];//学号也是一串数字,用数组存放
};
int main()
{struct Student s1 = { .age = 18,.name = "zhangsan" };return 0;
}

不按顺序初始化则需要用到'.'+变量名的形式,这样我们也可以不对全部的变量初始化。

此外,结构体也可以嵌套初始化

#include<stdio.h>
struct Student2
{char name[20];//名字是字符串,用数组存放int age;//年龄char sex[5];//性别是字符串,用数组存放int stunum[15];//学号也是一串数字,用数组存放
};
struct Student
{//学生的各种属性成员char name[20];//名字是字符串,用数组存放int age;//年龄char sex[5];//性别是字符串,用数组存放int stunum[15];//学号也是一串数字,用数组存放struct Student2 s2;
};
int main()
{struct Student s1 = { "zhangsan",18,"nan",{2,2,2,8,7,6,0,0,1},{ "lisi",20,"nv",{2,2,0,8,7,6,0,0,1}} };return 0;
}

我们后边初始化的李四的信息,就是嵌套初始化。

此外,我们还有一种初始化方法,用成员访问操作符来初始化。我们在下文结构体成员的访问中讲述。

三.结构体成员的访问与传参

结构体成员的访问有两种方法:

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

来看实例:

#include<stdio.h>
#include<string.h>
struct Student
{char name[20];int age;
};
void set_s(struct Student s)
{//用成员访问操作符来初始化s.age = 18;//s.name = "zhangsan";//错误写法,因为name是一个数组名,是一个地址//想要用成员访问操作符初始化数组类型的成员变量,要用到strcpystrcpy(s.name, "zhangsan");
}
void print_s(struct Student s)
{printf("%s %d",s.name, s.age);
}
int main()
{struct Student s;//写一个函数来给s中存放数据set_s(s);//写一个函数来打印s中的数据print_s(s);return 0;
}

这样我们便实现了用结构体变量.成员名来访问并初始化成员变量

但是我们上述的写法却忘记了一个非常重要的问题,那就是我们传递给函数的参数问题

我们知道,形参是实参的一份临时拷贝,改变形参的值并不会影响实参,所以我们如果想用用函数来访问初始化成员变量,就必须传址

#include<stdio.h>
#include<string.h>
struct Student
{char name[20];int age;
};
void set_s(struct Student *ps)
{//用成员访问操作符来初始化ps->age = 18;//s.name = "zhangsan";//错误写法,因为name是一个数组名,是一个地址//想要用成员访问操作符初始化数组类型的成员变量,要用到strcpystrcpy(ps->name, "zhangsan");
}
void print_s(struct Student s)
{printf("%s %d",s.name, s.age);
}
int main()
{struct Student s;//写一个函数来给s中存放数据set_s(&s);//写一个函数来打印s中的数据print_s(s);return 0;
}

接收地址便要用到指针,而用指针访问成员变量,就需要用到结构体指针->成员名。这样我们便可以得到结果:

 总结

关于结构体的基础知识到这里就要结束啦。

至此,博主也是讲完了有关C语言的各个章节的整体的基础知识。

后续将会不定时的更新一些难以理解或者是零碎的一些小知识点的讲解,敬请期待!

喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!

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

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

相关文章

【Linux】多线程2——线程互斥与同步/多线程应用

文章目录 1. 线程互斥1.1 问题引入1.2 线程互斥的相关概念1.3 互斥量mutex1.4 互斥量实现原理1.5 死锁 2. 线程安全和可重入函数3. 线程同步3.1 同步概念3.2 条件变量 4. 生产消费模型4.1 基于阻塞队列的cp模型4.2 基于环形队列的cp模型POSIX信号量 5. 线程池5.1 互斥量RAII版本…

二叉树的介绍

写在前面&#xff1a; 二叉树是数据结构课程中非常重要的内容&#xff0c;我们针对二叉树的概念、性质以及类型展开详细介绍。 一、概念 二叉树&#xff08;Binary Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集合&#xff0c;该集合或者空集&#xff0…

英语之美:用一句话解释句子结构

以下是一个包含主语、谓语、宾语、表语、定语、同位语、补足语和状语的扩展句子&#xff0c;使用 “I love you” 作为基础&#xff1a; “I, the person who truly loves you, consider our love a beautiful gift, and I love you more deeply with each passing day.” 在…

Android开机动画

Android开机动画 1、BootLoader开机图片2、Kernel开机图片3、系统启动时&#xff08;BootAnimation&#xff09;动画3.1 bootanimation.zip位置3.2 bootanimation启动3.3 SurfaceFlinger启动bootanimation3.4 播放开机动画playAnimation3.6 开机动画退出检测3.7 简易时序图 4、…

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解

前面我们介绍了K8SDockerMaven插件打包部署SpringCloud微服务项目&#xff0c;在实际应用过程中&#xff0c;很多项目没有用到K8S和微服务&#xff0c;但是用到了Docker和SpringBoot&#xff0c;所以&#xff0c;我们这边介绍&#xff0c;如果使用Jenkinsjib-maven-plugin插件打…

基于springboot实现websocket实时通讯启动项目报错

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

MySQL之事务与引擎

目录 一、事物 1、事务的概念 2、事务的ACID特点 3、事务之间的相互影响 4、Mysql及事务隔离级别(四种) 1、查询会话事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 5、事务控制语句 6、演示 1、测试提交事务 2、测试事务回滚 4…

鲁棒优化入门(7)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(下)

0.引言 上一篇博客介绍了使用Yalmip工具箱求解单阶段鲁棒优化的方法。这篇文章将和大家一起继续研究如何使用Yalmip工具箱求解两阶段鲁棒优化(默认看到这篇博客时已经有一定的基础了&#xff0c;如果没有可以看看我专栏里的其他文章)。关于两阶段鲁棒优化与列与约束生成算法的原…

【数学建模竞赛】数据预处理知识总结1——数据清洗

数据预处理是什么 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数据的真实性和建模结果的可靠性&#xff0c;需要…

SpringBoot v2.7.x+ 整合Swagger3入坑记?

目录 一、依赖 二、集成Swagger Java Config 三、配置完毕 四、解决方案 彩蛋 想尝鲜&#xff0c;坑也多&#xff0c;一起入个坑~ 一、依赖 SpringBoot版本&#xff1a;2.7.14 Swagger版本&#xff1a;3.0.0 <dependency><groupId>com.github.xiaoymin<…

【LeetCode】328. 奇偶链表

328. 奇偶链表&#xff08;中等&#xff09; 思路 如果链表为空&#xff0c;则直接返回链表。 对于原始链表&#xff0c;每个节点都是奇数节点或偶数节点。头节点是奇数节点&#xff0c;头节点的后一个节点是偶数节点&#xff0c;相邻节点的奇偶性不同。因此可以将奇数节点和偶…

图:关键路径

1. AOE网 与AOV网不同&#xff0c;AOE是用边表示活动的图或者网。 1.AOE网的概念 在带权有向图中&#xff0c;以顶点表示事件&#xff0c;以有向边表示活动&#xff0c; 以边上的权值表示完成该活动的开销(如完成活动所需的时间)&#xff0c; 称之为用边表示活动的网络&…

基于Springcloud微服务框架 +VUE框架开发的智慧工地系统源码

建筑行业快速发展&#xff0c;各建筑工程的建设规模在不断扩大&#xff0c;各岗位工作人员的工作内容所涉及的方面也越来越广泛。随着信息技术水平不断提高,人工记录的方式已经不能够满足大项目的管理要求&#xff0c;就此&#xff0c;创造出一种新型的施工管理技术——智慧工地…

【设计模式】装饰者模式

目录 一、定义二、结构三、优点四、使用场景五、代码示例六、截图示例 一、定义 1.在不改变现有对象结构的情况下&#xff0c;动态给该对象添加额外功能的模式 2.类B继承于类A&#xff0c;并将类A作为B类的属性&#xff08;B类聚合A类&#xff09; 3.BufferedInputStream、Buff…

OSI与TCP IP各层的结构与功能,都有哪些协议

分析&回答 OSI七层模型 层功能TCP/IP协议族应用层文件传输&#xff0c;电子邮件&#xff0c;文件服务&#xff0c;虚拟终端TFTP&#xff0c;HTTP&#xff0c;SNMP&#xff0c;FTP&#xff0c;SMTP&#xff0c;DNS&#xff0c;Telnet表示层数据格式化&#xff0c;代码转换…

pip安装第三方库与设置

pip的使用 假如下载numpy pip install numpypypi 镜像源「配置」 常用镜像源列表 官方&#xff1a;https://pypi.org/simple 百度&#xff1a;https://mirror.baidu.com/pypi/simple/ 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里&#xff1a;https://m…

uni-app 可视化创建的项目 移动端安装调试插件vconsole

可视化创建的项目&#xff0c;在插件市场找不到vconsole插件了。 又不好npm install vconsole 换个思路&#xff0c;先创建一个cli脚手架脚手架的uni-app项目&#xff0c;然后再此项目上安装vconsole cli脚手架创建uni-app项目 安装插件 项目Terminal运行命令&#xff1a;npm…

ArcGIS美化科研论文地图(利用在线底图)

1.加载在线底图服务 在ArcGIS Desktop中打开Catalog窗口&#xff0c;在GIS Servers中点击Add ArcGIS Server&#xff0c;之后选项全部默认&#xff0c;仅在URL中输入以下网址https://services.arcgisonline.com/arcgis 之后就可以看到底图了 我们在WorldElevation3D中选择Nat…

Leetcode---360周赛

题目列表 2833. 距离原点最远的点 2834. 找出美丽数组的最小和 2835. 使子序列的和等于目标的最少操作次数 2836. 在传球游戏中最大化函数值 一、距离原点最远的点 这题主要是理解题意&#xff0c;遇到L往左走&#xff0c;遇到R往右走&#xff0c;遇到_左右都可以走&#x…

SpringBoot 集成 Canal 实现监听MySQL表数据

SpringBoot 集成 Canal 准备工作什么是 CanalCanal 在 Spring Boot 中的作用和优势准备工作安装和配置 MySQL 数据库 安装Canal项目集成导入依赖添加配置信息创建监听类测试 准备工作 什么是 Canal Canal 是阿里巴巴开源的基于数据库增量日志解析的数据同步和订阅组件&#x…