结构体概念及应用

1.结构体类型的概念

在C语言中提供了很多基本的数据类型,但在实际开发中,无法满足程序中各种复杂数据的要求。有时需要将不同类型的数据组合成一个有机的整体,一边引用。例如:

numnamesexagescore
001lemonF18

90

在图中列举了学生的学号、姓名、性别、年龄和成绩几个项目,这几个项目都是相互联系的。如果将这些项目分别存成相互独立的一些变量,很难反映它们之间的内在联系。应该把这些项目组合成一个组合项,在这个组合项中可以包括若干个类型相同或者不同的数据项。这种数据结构就称为结构体。

结构体是一种构造类型,由若干成员组成,每一个成员可以是一种基本的数据类型或者另一种构造类型。因为结构体是一种用户自定义的数据类型,所以在使用之前需要先定义,也就是先构造。定义一个结构体的一般格式如下:

struct  结构体名

{

成员列表;

};

其中,“结构体名”是结构体的标志;花括号内是该结构体中的各个成员,每个成员都需要进行类型说明。声明格式如下:        类型名        成员名;

根据结构体的一般格式,将前面提到的学生结构体定义如下:

注意:

1.不要忽略最后的分号。

2.struct student     是一个类型名,它和系统中提供的标准的数据类型具有相同的地位和作用,都可以用来定义变量类型,只不过结构体类型需要由用户自己定义而已。

3.结构类型体和变量是不同概念,程序员只能对变量进行相应的运算,不能对结构体类型进行运算。系统在进行编译时,仅对变量进行储存空间的分配,并不对结构体类型进行空间分配。

4.结构体类型中的成员相当于变量的作用,并且,结构体中的变量可以单独使用。

5.结构体是可以嵌套的。在使用结构体嵌套时,要先声明内部的结构体struct date再声明外部的结构体struct student.在定义结构体类型struct student时,使用结构体

6.结构体类型中的成员变量可用于程序中其他变量同名。

2.结构变量

1.结构体变量的定义

上文介绍了结构体类型,该类型就相当于一个模型,在这个模型中没有具体的数据,编译器也不为其分配实际的内存单元。结构体类型定义后就可以使用了,下面介绍三种定义结构体类型变量。

1.先定义结构体类型,再声明结构体变量

在前面定义了结构体类型struct student,可以用该结构体类型定义变量。

例如,定义一个结构体类型的变量stu如下:

struct student (结构体类型名)       stu ;(结构体变量名)

这里定义了一个名为stu的struct student类型的变量,也就是说它拥有struct  student的结构。

变量stu被定义后,系统会为其分配内存单元。对于每一个struct  student类型的变量,系统都会为其分配33个字节的内存空间(4+20+1+4+4)。

说明:

如果要编写的程序规模比较大,经常会将这些结构体类型的声明存放在一格后缀名为.h的文件中,如果某个程序需要该结构体,就可以用#include命令将该头文件包括进来,从而便于程序员的修改和使用。

2.在定义结构体类型的同时声明结构体变量

一般格式为:例子:

3.直接声明结构体变量

直接声明结构体变量,是指不声明结构体名称,直接定义结构体类型。它与第二种方法比较类似,不同的是,它不需要定义结构体名称。其一般格式如下:

例子:

4.typedef

typedef相当于struct  结构体名;就像人的小名一样

可以直接定义结构体变量。

2.结构体类型变量的引用


(1) 不能将 结构体变量作为 一个整体进行引用,比如s1,s2都是结构体变量,但不能拿过来直接用,只能对结构体变量中的 各个成员分别引用;引用的方式为:
结构体变量名 . 成员名      [这个 .  叫做结构成员运算符,该运算符优先级 非常高  ,与()平级,所以可以把                                                 s1.num 看作是一个整体]
例如:s1.num=1001;  //将1001赋值给s1变量中的成员num
(2) 如果成员本身 又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级成员,只能对最低级成员进行赋值或者存取。
s1.birthday.month=12;
s1.birthday.day=30;
s1.birthday.year=2018;
(3) 成员变量,就当成普通变量,可以像普通变量一样进行各种运算
s2.age=s2.age;    //赋值
int agesum=s2.age+s2.age;   //求年龄和
s1.age++;      //年龄自加1,因为 .   的优先级最高,所以s1.age是个整体。
//s1++;  这样是不可以的这样写的。也不可以这样写:s1.brithday++;
(4) 因为成员变量我们也是当成普通变量的,所以它们 也是有地址的。
int *p=&s1.num;
pritntf("%d\n",*p);    //结果是:1001

3.结构体变量的初始化

1.基本初始化

基本初始化是最常用的结构体初始化方法,通过使用“{}”括号来初始化结构体变量。例如:

2.指定成员初始化

指定成员初始化可以通过指定成员名来初始化结构体的成员变量。例如

3.常量表达式初始化

常量表达式初始化可以在结构体定义时用常量表达式对结构体成员进行初始化。

4. 定义后逐个赋值

5. 定义时乱序赋值

3.结构体的嵌套

4.结构体数组

1.定义结构体数组

类型定义结构体数组和定义结构体类型变量的方法类似,都有3种方法。下面有3种方法定义一个结构体类型数组emp,该数组有10个元素,每个元素都是student结构体类型。

1.先定义结构体类型,再声明结构体数组

2.在定义结构体类型的同时定义结构体数组

3.直接定义结构体数组

2.初始化结构体数组

  

3.结构体数组的赋值

4.结构体指针

1.指向结构体变量的指针

结构体指针变量的定义格式为:struct        结构体名称        *结构体指针变量名;

2.指向结构体数组的指针

此时指针变量的值就是结构体数组的首地址。

例如定义一个结构体数组student[5],使用结构体指针指向该数组

代码为:struct        Student*p;                p=student;

也可以直接指向结构体数组的元素例:p=&student[2];

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

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

相关文章

VRRP协议详解

目录 一、基础概念 1、概念 2、VRRP的基本结构 状态机 二、VRRP主备备份工作过程 1、备份工作过程 2、VRRP的负载分担工作 三、实验 一、基础概念 1、概念 VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的I…

【STM32入门】4.1中断基本知识

1.中断概览 在开展红外传感器遮挡计次的实验之前,有必要系统性的了解“中断”的基本知识. 中断是指:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转…

Oracle MongoDB

听课的时候第一次碰到,可以了解一下吧,就直接开了墨者学院的靶场 #oracle数据库 Oracle数据库注入全方位利用 - 先知社区 这篇写的真的很好 1.判断注入点 当时找了半天没找到 看样子是找到了,测试一下看看 id1 and 11 时没有报错 2.判断字段…

JMeter下载与安装

文章目录 前言一、安装java环境(JDK下载与安装)二、JMeter下载三、JMeter安装1.解压缩2.配置环境变量 四、JMeter启动(启动成功则代表JMeter安装成功)五、JMeter汉化(将JMeter修改成中文)1.方法一&#xff…

深圳锐科达IP网络广播系统

深圳锐科达IP网络广播系统 网络音频广播系统是一种基于TCP/IP网络的纯数字音频广播系统。该网络音频广播系统在物理结构上与标准IP网络完全集成。它不仅真正实现了基于TCP/IP网络的数字音频的广播、直播和点播,而且利用TCP/IP网络的优势,突破了传统模拟广…

DeepStream--调试Gstreamer

DeepStream是基于Gstreamer开发的。有时候需要在Gstreamer加日志,比如想在rtpjitterbuffer里加日志。 首先,执行gst-inspect-1.0 rtpjitterbuffer命令。 从结果中可以看到,rtpjitterbuffer插件的源码是gst-plugins-good,版本是1…

Tomcat的结构分析和请求处理原理解析

目录 Tomcat服务器?Tomcat结构处理请求流程Tomcat作用其他的web服务器 Tomcat服务器? 我们经常开口闭口“服务器”、“服务器”的,其实“服务器”是个很容易引发歧义的概念 其实,Tomcat服务器 Web服务器 Servlet/JSP容器&#…

最新Redis7主从复制(保姆级教程)

前提准备:三台云服务器(吐血消费,点赞回血)也可以使用虚拟机创建三台,但是我搞了一天也连接不上,要是又可以连接上的大家可以教我一下,也可以参考一下或者大家可以参考一下这个大佬的配置&#…

人工智能与天文:技术前沿与未来展望

人工智能与天文:技术前沿与未来展望 一、引言 随着科技的飞速发展,人工智能(AI)在各个领域的应用越来越广泛。在天文领域,AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合,以及这种结合带…

大数据Doris(三十六):Duplicate 模型(冗余模型)介绍

文章目录 Duplicate 模型(冗余模型)介绍 一、创建doris表 二、插入数据

PR模板,复古怀旧电影效果视频制作PR项目工程文件

Premiere复古怀旧电影效果视频制作pr模板项目工程文件下载 这个PR模板以复古城市印象电影质感为特色,结合了电影和数字故障效果。包含6个场景。可以编辑文本、添加媒体和自定义颜色。包含视频教程。4K版本。不需要任何插件。 软件支持:PR2022 | 分辨率&a…

DBA面试题

Oracle体系结构 (1)、Oracle实例内存中包含哪些部分? 答: sga与pga sga:是一组共享的内存区域,包含数据字典缓存、库缓存、重做日志缓冲区 Pga:为每个服务器进程分配的非共享内存,存储会话状态和私有SOL工作区 在Oracle数据库中&…

StarCCM+ 导入STL几何模型进行仿真

使用 StarCCM 进行仿真时,通常都是用 3D-CAD Model 导入 CAD 类型的几何模型。但对于一些特殊情况,例如通过三维重建等方法获得的几何模型是 STL 文件而非 CAD 文件,这种情况下可以通过 Import Surface Mesh 的方法导入 STL 文件进行仿真&…

ubuntu pycharm 死机,如何重启

1. 找出pycharm 进程的id 进入命令行: ps -ef 是查看当前运行的进程 值输入 ps -ef 会返回所有当前执行的进程,太多了,过滤一下,找到 pycharm : ps -ef | grep pycharm 2. 使用 kill -s 9 来杀死进程 如图所是,…

文字转语音自动合成系统源码:让你的语音自动转成文字 附带完整的搭建教程

人工智能技术的不断发展,语音识别和自然语言处理技术已经逐渐成熟。文字转语音自动合成系统就是结合了这两项技术,将文字信息转化为语音输出,为用户提供更加便捷、高效的信息获取方式。这种系统在语音助手、智能客服、教育学习等领域有着广泛…

11月,1Panel开源面板项目收到了这些评论

2023年11月24日,1Panel开源面板项目(https://github.com/1Panel-dev)发布了题为《10月,1Panel开源面板收到了这些评论》的社区评论合集。在该文章的评论区,很多社区用户跟帖发表了自己对1Panel开源项目的使用感受和意见…

二叉搜索树--二叉排序树

特性 搜索依据的关键码&#xff0c;所有节点的关键码互不相同非空左子树的所有键值小于其根结点的键值。非空右子树的所有键值大于其根结点的键值。左、右子树都是二叉搜索树。左 < 根 < 右&#xff0c;左右都是二叉排序树二叉搜索树-中序遍历从小到大有序 创建二叉搜…

精通Spring整合MyBatis:架构师的实践指南

引言&#xff1a; 介绍Spring和MyBatis的基本概念及其在Java应用开发中的重要性。 整合原理 在整合Spring和MyBatis时&#xff0c;关键在于理解两者是如何协同工作的。Spring框架主要负责管理Java应用的生命周期和依赖注入&#xff0c;而MyBatis则专注于数据库操作和映射。 …

c++知识总结

一 细碎知识 1.9 I 1.9.1 inline 参考 C语言中头文件中的 static inline 函数以及 __attribute__((always_inline)) 强制内联展开-CSDN博客https://blog.csdn.net/m0_37616597/article/details/104138980 慎用 inline 内联能提高函数的执行效率,为什么不把所有的函数都定…

高分辨率台阶仪,精准掌控细节测量

什么是台阶仪&#xff1f; 台阶仪是一款超精密接触式微观轮廓测量仪&#xff0c;可以对微米和纳米结构进行膜厚和薄膜高度、表面形貌、表面波纹和表面粗糙度等的测量。 什么是台阶仪分辨率&#xff1f; 台阶仪分辨率是指在台阶仪的测量范围内&#xff0c;仪器能够精确分辨出的…