结构体概念及应用

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.hqwc.cn/news/278348.html

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

相关文章

R语言piecewiseSEM结构方程模型在生态环境领域实践技术

结构方程模型(Sructural Equation Modeling,SEM)可分析系统内变量间的相互关系,并通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和广泛的适用性,是近年来生态、进化、环境、地学、…

SpringBoot接入企微机器人

1、企业微信创建机器人(如何创建不懂的请自行百度,很简单的),成功后能获取到一个Webhook地址:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa 2、创建一个SpringBoot项…

【Hive】——DDL(PARTITION)

1 增加分区 1.1 添加一个分区 ALTER TABLE t_user_province ADD PARTITION (provinceBJ) location/user/hive/warehouse/test.db/t_user_province/provinceBJ;必须自己把数据加载到增加的分区中 hive不会帮你添加 1.2 一次添加多个分区 ALTER TABLE table_name ADD PARTITION…

OpenHarmony关于修改系统横屏导致启动视频显示不全问题解决

前言 OpenHarmony源码版本:4.0release 开发板:DAYU / rk3568 前段时间写的设置OpenHarmony启动视频,在竖屏状态下是正常的,但是横屏状态下显示不全。 链接直达:OpenHarmony 设备启动Logo和启动视频替换指南-CSDN博…

【专题】树和二叉树的转换

目录 一、树转换成二叉树步骤一:加线——在兄弟之间加连线步骤二:抹线——除结点的左孩子外,去除其与其余孩子之间的关系步骤三:旋转——以树的根结点为轴心,将整树顺时针转45 二、二叉树转换成树步骤1:加线…

【setDS】牛客小白月赛83 E

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先,一个必要步骤是把它转化为两个序列,这样就变成了一个序列DS问题 我们的答案是一个位置 pos 后面还有多少位置和这个位置的颜色相同,考虑得到这个答案我们需要维护什么东西 我们只需要…

MongoDB 与 Python 的交互

文章目录 第1关:MongoDB 与 Python 的交互 第1关:MongoDB 与 Python 的交互 编程要求 根据提示,在右侧编辑器 Begin-End 处补充代码,完成右侧程序。 测试说明 点击评测,平台会对你编写的代码进行测试。 import pymo…

AI日报:OpenAI向新用户重新开放ChatGPT Plus订阅

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 总览Chatgptplus重新开放订阅#暂停原因功能 OpenAI的1000万美元安全人工智能拨款拨款初衷学术捐赠 总览 ChatGPT Plus再次向新用户开放,但目前每三小时限制发送40条消息。 OpenAI还宣布拨款1000万美元…

【Hive】——DDL(TABLE)

1 查询指定表的元数据信息 如果指定了EXTENDED关键字,则它将以Thrift序列化形式显示表的所有元数据。 如果指定了FORMATTED关键字,则它将以表格格式显示元数据。 describe formatted student;2 删除表 如果已配置垃圾桶且未指定PURGE&…

ToolLLM model 以及LangChain AutoGPT Xagent在调用外部工具Tools的表现对比浅析

文章主要谈及主流ToolLLM 以及高口碑Agent 在调用Tools上的一些对比,框架先上,内容会不断丰富与更新。 第一部分,ToolLLM model 先来说主打Function Call 的大模型们 OpenAI GPT 宇宙第一LLM,它的functionCall都知道&#xff0…

恒创:更换服务器,网站备案会掉吗

随着互联网的普及,越来越多的企业和个人选择通过网站来展示自己的形象和业务。然而,在网站建设和运营过程中,更换服务器是一个常见的问题。那么,更换服务器后,网站备案是否会受到影响呢? 网站备案是为了保…

前端开发中的单元测试(unit testing)和端到端测试(end-to-end testing)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…