前面学习了变量和数组这些简单的数据结构,它们的特点是必须使用规定的数据类型。例如数组被定义为整型后,它的所有存储单元都是由整型构成。现实生活中某一类事物的共同属性可能是由不同的数据类型组成的集合,或者某一属性在不同的情况下表现为不同的数据类型。本章将讲解结构体与共用体,用来设计复合数据结构。

7.1 结构体类型变量的定义和引用

结构体是一种复合数据类型,它由不同数据类型的存储单元组合。例如,学生的成绩表上有姓名、专业、学号和没门功课成绩,姓名和专业可以看作是字符串型数据,学号是无符号长整型数据,每门功课是单精度浮点型数据,由这些类型复合组成的学生成绩单数据类型,就是结构体类型。

7.1.1 结构体类型变量的定义

在定义结构体类型变量之前,首先需要设计结构体,定义结构体的名称和成员的数据类型,然后使用结构体说明变量,这时结构体就成为了一种新的数据结构。定义结构体使用修饰符 struct,它一般形式为:

struct 结构体名
{
    成员列表
};

结构体名是该结构体独一无二的名称,命名规则与变量命名相同。成员项列表是结构体中数据成员的数据类型和名称。数据成员可以是变量、数组或者其他结构体等复合数据结构。成员项列表的一般形式为:

数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;
...

如下例所示,学生成绩单,该结构为 4 个成员,name[] 和 dept[] 是字符型数组,用于保存学生姓名与专业,no 是长整型变量,用于保存学生的学号,score[]是单精度浮点型数组,用于保存学生的成绩。

struct student            // 结构体名
{char name[50];        // 姓名char dept[50];        // 专业long no;            // 学号float score[4];        // 成绩
};                        // 结构体定义结束一定要加上分号

结构体定义后,并没有在内存中为该结构体划分存储空间,它只是作为一种数据结构存在。只有在使用结构类型声明变量后,系统才用该结构体分配内存空间给变量。使用结构体声明变量的一般形式是:

struct  结构体名 结构体变量名

该语句只能在结构体定义后出现。如下例所示:

struct student stu1, stu2;        // 声明结构体变量 stu1,stu2

结构体变量的声明还有其他形式,例如直接在定义结构体的同时声明变量,或者省略结构体名直接定义结构体类型的变量。如下例所示:

struct student        // 结构体名
{// ...            // 成员列表
} stu1, stu2;        // 定义结构体的同时声明变量struct
{// ...            // 成员列表
} stu1, stu2;        // 省略结构体名直接定义结构体类型的变量

这2种用法使结构体丧失了通用性,特别是省略结构体名的做法,这样结构体就不能在源代码其他部分声明更多的结构体变量。在编写大型程序的源代码时,结构体定义部分通常放在头文件中,使用时包含该头文件,这样一个结构体不需要在程序中的不同文件中反复定义。

7.1.2 结构体类型变量的引用

应用结构体变量的数据需要同时给出结构体变量名和数据成员名。引用结构体变量的一般形式为:

结构体变量名.数据成员名

它们之间用“.”操作符分隔。如下列代码所示:

stu1.no = 20090001;            // 使用“.”操作符引用结构体成员

这2种符号的优先级高于算术运算符和赋值符号,所以结构体变量的成员与普通的变量或数组使用方法完全相同。

7.1.3 结构体类型变量的初始化

结构体汇集了不同的数据类型,为结构体类型变量初始化就略显复杂,需要考虑初始化数据与结构体成员项数据类型的匹配。如下例所示:

struct student stu1 = {"Tom", "Math", 20090001, 87.5, 70.5, 93, 91}; // 声明结构体变量并初始化

该语句为结构体变量 stu1 的成员赋值,各成员的值分别为:

stu1.name = "Tom"        // 引用 name 成员并赋值
stu1.dept = "Math"        // 引用 dept 成员并赋值
stu1.no = 20090001        // 引用 no 成员并赋值
stu1.score[0] = 87.5    // 引用 score 成员,并为该数组的第 1 个元素赋值
stu1.score[1] = 70.5
stu1.score[2] = 93
stu1.score[3] = 91

这种初始化方法的原理是,结构体的成员在内存的连续空间中顺序存储,从结构体的首地址开始依次
将匹配的数据类型保存在对应的内容单元中。如果结构体中以另一个结构体作为成员项,如下例所示:

struct strc1            // 定义结构体 strc1
{int a;long b;
};struct strc2            // 定义结构体 strc2
{float a;struct str1 b;        // 将结构体 strc1 作为 strc2 的成员项
}struct strc2 x;            // 定义结构体变量x

那么结构体变量 x 中各成员的分配仍然是在连续空间中,结构体变量 x 的成员项 b 在 内存空间中的总长度为结构体 strc1 定义的长度,分布形式如 strc1 定义的顺序,如下图所示:

【C语言入门教程】7.1 结构体类型变量的定义和引用相关推荐

  1. Nwafu-Oj-1444 Problem l C语言实习题七——2.结构体数组的定义与引用

    问题 : C语言实习题七--2.结构体数组的定义与引用 时间限制: 1 Sec  内存限制: 128 MB 提交: 4459  解决: 2011 [提交][状态][讨论版] 题目描述 定义一个职工结构 ...

  2. c语言中结构体变量的作用,C语言 结构体 类型变量的 定义 和 引用

    前面学习了变量和数组这些简单的数据结构,它们的特点是必须使用规定的数据类型.例如数组被定义为整型后,它的所有存储单元都是由整型构成.现实生活中某一类事物的共同属性可能是由不同的数据类型组成的集合,或者 ...

  3. c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  4. c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...

    C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...

  5. C语言入门系列之10.结构体和共用体

    文章目录 一.结构体变量的基本使用 1.概述 2.定义结构体类型变量的方法 3.结构体变量的引用 4.结构体变量的初始化 二.结构体的高级应用 1.结构体数组 Ⅰ定义结构体数组 Ⅱ结构体数组的初始化 ...

  6. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

  7. C语言中结构体变量的定义及引用

    一.结构体变量的定义 1.结构体类型与结构体变量分开定义 一般形式如下: struct<结构体名><结构体变量名>; eg:struct student student1,st ...

  8. Linux C 深入分析结构体指针的定义与引用

    关于结构体的基础知识,网上书上都一大堆,这里就不赘述了,下面我们要学习的是结构体指针. 介绍结构体指针之前,先给大家看一个小程序: [cpp] view plaincopy #include < ...

  9. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

最新文章

  1. 实战解析:真实AI场景下,极小目标检测与精度提升 | 百度AI公开课
  2. jtable根据内容自动调整列宽
  3. Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果(1)
  4. SQL批量更新DateTime中的年、月、日
  5. java 年计算_java实现计算某年某月的天数
  6. HTML5+CSS3实现的响应式垂直时间轴
  7. 最简单的delphi启动画面(转)
  8. Struts2 文件上传 文件类型 大小过滤
  9. c#基础系列2---深入理解 String
  10. 使用fseek()函数随机访问文件
  11. 中国慢病管理行业市场形势调查分析及价值研究报告2021-2027年版
  12. html图片控件显示图片不清楚,jQuery图片模糊插件crossfade.js
  13. 《阴阳师·2栀子女》原作:梦枕貘
  14. “掌上理财”项目总结
  15. OpenCV官方教程中文版
  16. python编写交互界面查分,Python实现CET查分的方法 -电脑资料
  17. java实现生产者消费者模式
  18. 写博客,轻松拿大奖!博客征文第二期:那些年我们一起写过的代码
  19. 操作animate.css的一些小技巧
  20. 整数拆分的两种解法(已完成)

热门文章

  1. 有向图最小路径覆盖方法浅析、证明 //hdu 3861
  2. haproxy LVS nginx的比较
  3. IDEA Properties中文unicode转码问题
  4. IT职场人生系列之二十二:如何学习新语言(二)
  5. ip地址子网划分工具_大型视频监控网络系统如何规划ip地址?
  6. python积分管理系统_python实现每天自动签到领积分的示例代码
  7. python网页查询然后返回结果_使用pythondjang在html页面上显示查询到的API结果
  8. 身为程序员的你一定要学会Python这个神操作,会这个想单身都难
  9. 重庆交通大学2019年计算机系收分,重庆交通大学2019年考研复试分数线已公布
  10. pcf8574c语言测试程序,PCF8563驱动程序(C语言版)