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

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. 【C语言入门教程】4.5 指针变量的定义与引用

    指针变量是包含内存地址的变量.一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址.普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值.指针变量在使用前需要声明与 ...

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

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

  3. 智能合约语言 Solidity 教程系列6 - 结构体与映射

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...

  4. 【C语言入门教程】7.3 结构体指针的定义和引用

    C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...

  5. C语言入门(14)——结构体

    整数.字符.布尔值.浮点数这些数据类型都具有单一的值,这些可称为基本数据类型.但字符串是一个例外,它由很多字符组成,像这种由基本类型组成的数据类型称为复合数据类型,正如表达式和语句有组合规则一样,由基 ...

  6. C语言入门(15)——结构体与数据抽象

    大多数的计算机运算是对现实世界的模拟,如果想用计算机来模拟现实世界需要用到数据抽象的方法.所谓抽象是从实际的人.物.事和概念中抽取所关心的共同特征,,忽略非本质的细节,吧这些特征用各种概念精确的加以描 ...

  7. 【C语言入门教程】目录/大纲

    第一章 C语言编程基础 1.1 基本程序结构 1.2 函数库 和 链接 1.3 C语言“32个”关键字 第二章 数据类型.运算符和表达式 2.1 数据类型(5种基本数据类型),聚合类型与修饰符 2.2 ...

  8. 《JavaScript语言入门教程》记录整理:入门和数据类型

    目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...

  9. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

随机推荐

  1. ionic的scroll的使用出现的问题

    今天再写ionic的时候发现了一个问题,在使用ui-view的时候引用ion-scroll指令的时候初次加载的时候能能实现拖拽滚动,只能实现滚动鼠标滚轴滚动,然后各种调试,各种比较,终于发现原来是路由 ...

  2. 安装vim的ycm

    环境centos 6.7 vim 7.3 安装vundle Vundle(Vim bundle)是一个Vim的插件管理器.它是把git操作整合进去,用户需要做的只是去GitHub上找到自己想要的插件的 ...

  3. NGINX 配置404错误页面转向

    什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是 ...

  4. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在上一篇中,我们已经初步开始使用Web Api了,但同时出现了一些很多不足之处,本章我们就着 ...

  5. Jquery实现textarea根据文本内容自适应高度

    本文给大家分享的是Jquery实现textarea根据文本内容自适应高度,这些在平时的项目中挺实用的,所以抽空封装了一个文本框根据输入内容自适应高度的插件,这里推荐给小伙伴们. autoTextare ...

  6. css 网站变灰色

    网站变灰色 html{ -webkit-filter: grayscale(%); -webkit-filter: grayscale(); filter: grayscale(%); filter: ...

  7. yourphp 遇见问题及解决办法

    1.前台页面提交出现 __NOLAYOUT__ 解决把法: 在Public 文件下找到 success.html,error.html,exception.html 头部去掉就可以

  8. Quartz.NET总结(二)CronTrigger和Cron表达式

    Quartz.NET的任务调度,主要就是依靠CronTrigger和Cron表达式.Cron是已经在UNIX存在了很长一段时间,它有着强大和可靠的调度能力.CronTrigger类也正是是基于Cron ...

  9. xcode

    1: info.plist IOS之Info.plist文件简介 http://www.apkbus.com/android-130240-1-1.html 在Xcode项目中读取plist文件 ht ...

  10. MVC5的AuthorizeAttribute详解

    现今大多数的网站尤其是购物网站都要求你登录后才能继续操作,当你匿名的将商品放入购物车后,不可能匿名购买这时可以转到登录界面让用户进行登录验证. 适用系统自带的过滤器 MVC5只要将属性[Authori ...