构造型数据类型之结构体.ppt

上传人:za****8 文档编号:16591835 上传时间:2020-10-17 格式:PPT 页数:38 大小:398.34KB
返回 下载 相关 举报
构造型数据类型之结构体.ppt_第1页
第1页 / 共38页
构造型数据类型之结构体.ppt_第2页
第2页 / 共38页
构造型数据类型之结构体.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
4 2 结构体 4 2 1 结构体的概念 一个数组由类型相同的元素组成,但有些数据类型可 能由性质不同的成员组成,这些成员相互关联组成一个整 体数据。例如,一个职工的工作证号 (number)、姓名 (name)、性别 (sex)、 年龄 (age)、部门 (department)、 工资 (wage)等,这些成员都属于某个职工的数据项 ,如果 分别定义成相互独立的变量,则不能体现它们之间的内在 联系,而在程序中应该把它们视为同一个数据类型的成员。 第 4章 构造型数据类型 之 结构体 第 4章 构造型数据类型 之 结构体 利用 C语言的结构体类型就可完成这一功能 。 例如: struct staff char number8; char name10; char sex; int age; char dep20; float wage2; ; number 数组 name 数组 sex 成员 age 成员 dep 成员 wage 成员 struct staff 这样定义的结构体所需的空间 是每个成员所需空间之和。这 个 struct staff共需要 47个字节 第 4章 构造型数据类型 之 结构体 以上定义了一个结构体类型 struct staff, 它包含了 number、 name、 sex、 age、 dep、 wage等不同类型的数据项。这样就可在程 序中使用 struct staff类型的变量,把一个 职工的相关信息合在一起,组成一个整体 来处理。 此时,就可以用 struct staff这个类型定义 出变量。 第 4章 构造型数据类型 之 结构体 例如下面程序段: struct staff worker; *定义一个 structstaff类型的变量 worker * worker.sex M; *给 worker变量的 sex成员赋值 M* strcpy(worker .name, ” 李大磊 ” ); *给 worker变量的 name成员赋值 ” 李大磊 ” * printf(“姓名 :%s性别: %c n”, worker.name, worker.sex); *输出 worker变量的数据 * 第 4章 构造型数据类型 之 结构体 4 2.2 结构体类型及结构体变量 1 结构体类型说明的一般形式 struct 结构体名 类型名 1 结构体成员名表 1; 类型名 2 结构体成员名表 2; 类型名 n 结构体成员名表 n; ; 第 4章 构造型数据类型 之 结构体 说明: (1)结构体类型名和结构体变量名由用户命名 , 命名规则与标识符命名 规则相同 (即与变量命名规则相同 )。 (2)每个 “ 结构体成员名表 ” 都可以含有多个相同类型的成员名 , 它们 之间以逗号隔开 。 结构体成员的命名规则与变量名的命名规则相同 。 结构体成员名允许与该结构体外的变量重名 , 不同结构体中的成员也 可以同名 , 它们代表不同的对象 , 互不干扰 。 (3)结构体成员的类型可以是基本类型 、 数组 、 共用体 、 指针 、 空类型 或已说明过的结构体类型等 。 (4)其中 struct是 C语言的关键字 , 是结构体类型的引导字 , 用于说明结 构体类型以及定义结构体变量 。 第 4章 构造型数据类型 之 结构体 (5)结构体说明的花括号后要以分号 “ ; ” 结尾 。 例如一本书有书号 、 书名 、 作者 、 价格 、 简介等数据项 , 可以定义书的结构体类型如下: struct book_type int num; char name60; char writer30; float price; char brief300; ; 这个分号不能少 第 4章 构造型数据类型 之 结构体 结构体成员也可以是一个结构体变量 , 即结构体允许嵌套结构 。 例如:下面语句定义了一个有嵌套结构的结构体 。 struct date unsigned char month; unsigned char day; unsigned year; ; struct staff char number8; char name10; struct date birthday; int age; char dep20; float wage2; ; 结构体类型说明只是说明了一个构 造型数据类型,系统没有分配任何存 储空间。必须定义相应结构体类型的 变量,系统才为该变量分配存储空间。 类型与变量是不同的概念。 第 4章 构造型数据类型 之 结构体 2 结构体变量的四种定义方式 (1)紧跟在类型说明之后定义变 量 、 数组 例如: struct book_type int num; char name60; char writer30; float price; char brief300; bookl, books3; 此处:在说明结构体类型 struct book_type的同时,定义了一个结 构体变量 bookl与一个结构体数组 books,数组 books有三个元素: books0、 books1、 books2。 这种定义变量的一般形式为: struct 结构体名 结构体成员表 变量名表; 第 4章 构造型数据类型 之 结构体 (2)先说明结构体类型 , 再单独进行变 量 、 数组定义 例如: struct staff char number8; char name10; int age; char dep20; float wage2; ; struct staff worker1,worker2; 此处先说明了结构 体类型 struct staff ,再由另 条语句 定义变量 workerl与 worker2为 struct staff类型的变量。 第 4章 构造型数据类型 之 结构体 (3)说明一个无名结构体类型,直接 定义变量、数组 例如: struct unsigned char month; unsigned char day; unsigned year; workerl, worker2, d15; 以上说明结构体类型时 省略了结构体类型名, 直接定义结构体数组 d1 与结构体变量 worker1、 worker2。若程序中不需 要再次定义该结构体类 型的变量,可用这种方 式一次性定义变量。 第 4章 构造型数据类型 之 结构体 ( 4)用 typedef说明一个结构体类型名,再用 类型名进行变量定义 (详见本章 4 5节 )。 第 4章 构造型数据类型 之 结构体 4 2 3 结构体变量的使用 结构体是一个构造型数据类型 , 由此定义的结构体变量的 成员 , 也可以像其他类型的变量一样被赋值 , 参与表达式 运算以及用于输入 、 输出等操作 。 1 结构体变量成员的使用 结构体变量成员的表示方式为: 结构体变量名 成员名 第 4章 构造型数据类型 之 结构体 运算符 “ ” 称为结构体成员运算符 , 它在 C语言中 的运算优先级的级别是最高的 。 可以把 “ 结构体变量 名 成员名 ” 看成一个整体 , 则这个整体的数据类型与结 构体中该成员的数据类型相同 , 可以像使用一个简单变量 一样使用 “ 结构体变量 名 成员名 ” 。 对于多层嵌套结构体成员的使用 , 应按照从最外层到 最内层的顺序逐层使用成员名 , 每层成员名之间用结构体 成员运算符 “ ” 隔开 , 只能对最内层的成员进行存取 、 运算以及输入 、 输出等操作 。 第 4章 构造型数据类型 之 结构体 例 4 8学生的数据包括学号、姓名、出 生日期、三门课成绩、总分及平均分。定 义一个结构变量,其中每个成员都从键盘 接收数据,然后计算总分及平均分,最后 输出该学生的所有数据。请注意这个例子 中不同类型的结构体成员的使用方法。 第 4章 构造型数据类型 之 结构体 #include #define ESC 27 struct student_ type long int num; *学号 * char name10; *姓名 * struct date_type int month; int day; int year; birthday; *出生日期 * float score3, total, average; *三门课成绩 、 总分 、 平均分 * 第 4章 构造型数据类型 之 结构体 main ( ) struct student_type stu; *定义 struct student_type类型的结构体变量 stu * do printf(”请输入学生的学号 、 姓名 、 出生年 、 月 、 日及三门课学习成绩 :n”); scanf(” 1d s”, *书名 * char author30; *作者 * float price; *价格 * struct datetp unsigned year; unsigned month; pubday; *出版日期 * bookl ”SQL-Server循序渐进教程 ” , ” Petkovic”, 35.0, 1999, 6, book2 ”VB开发指南 ” , ” Dianne Siebold”; 第 4章 构造型数据类型 之 结构体 printf(” s, 作者: s, 出版日期: d年 d月 , 价格: 5 1fn”, bookl name , bookl author , bookl pubday year , bookl pubday month, bookl price); printf(” s, 作者: s, 出版日期: d年 d月 , 价格: 5 1f n”, book2 name , book2 author , book2 pubday year , book2 pubday month, book2 price); 上述程序段运行结果为: SQLServer循序渐进教程 , 作者: Petkovic, 出版日期: 1999年 6月 , 价格: 35 0 VB开发指南 , 作者: DianneSiebold, 出版日期: 0年 0月 , 价格: 0 0 第 4章 构造型数据类型 之 结构体 2 结构体数组初始化 结构体数组初始化的方法与数组的初始化 相类似。由于数组中的每个元素都是一个 结构 体,可以将每个元素中成员的初值 依次放在一对花括号内,以便区分各个元 素。例如: 第 4章 构造型数据类型 之 结构体 struct student tp char num10; , char name10; float score; student3=“304001”, ” 张驰 ” , 65, “304002”, ” 杨明 ” , 78, “304005”, ” 王丰 ” , 86 ; 第 4章 构造型数据类型 之 结构体 也可以在初始化时不指定数组的长度 , 系统根据所赋初值的个数决 定数组元素的个数 。 例如下面的语句与上述语句等价: struct student_tp char num10; char name10; float score; student=“304001”, ” 张驰 ” , 65, “304002”, ” 杨明 ” , 78, “304005”, ” 王丰 ” , 86; 初始化时内层的花括号可以省略,但省略后各元素的初值连成一片, 容易混淆。因此,一般不省略内层的花括号。 第 4章 构造型数据类型 之 结构体 4 2 5 位段 有时只需要 1位或几位就可以存储一个信息 。 例 如: “ 真 ” 用 1表示 , “ 假 ” 用 0表示 , 只要 1位就 够存放 了 , 如果用字符 (char)类型的变量来表示 , 要占用 内存一个字节 (8位 ), 浪费了存储空间 。 另外 , 有时 要存取一个或多个字节的某几位 , 或对一个或多个 字节的某几位进行位运算 , 虽然利用第二章中讲述 的按位运算可以完成这些操作 , 但较繁琐 。 利用 C 语言提供的位段 , 可以解决上述问题 。 第 4章 构造型数据类型 之 结构体 1 位段的定义 所谓位段是以位为单位定义变量占内存空 间的大小 。 C语言中没有专门的位段类型 , 而是借助于结构体类型 , 以二进制位为单 位来说明结构体中成员所占空间的大小 。 第 4章 构造型数据类型 之 结构体 例如: struct bit_field unsigned a: 3; unsigned b: 6; unsigned c: 11; int i; x; 以上定义了一个结构体变量 x, 它有三个位段成员和一个 整型成员 。 第 4章 构造型数据类型 之 结构体 i 空闲 c b a 16位 4位 11位 6位 3位 带位段的结构体变量 x的内存分配情况 第 4章 构造型数据类型 之 结构体 位段定义的一般形式为: struct 结构体名 类型名 位段名 :整型常量表达式; 变量名表 ; 第 4章 构造型数据类型 之 结构体 说明: (1)此处类型名只能是 unsigned或 int类型 。 整型常量表达式用于指定每个位段 的宽度 , 即该位段占内存多少位 。 位段宽度的取值范围在 0一 16之间 。 (2)有时方括号内的内容可以省略 。 省略位段名时 , 该位段称为无名位段 。 无 名位段的作用是跳过不使用的某几个位 。 当无名位段宽度为 0时 , 将使下一个 位段从一个新的字节开始存放 。 (3)位段成员的内存空间分配方向 , 因机器而异 。 IBM PC兼容机是 “ 从低字节 到高字节 ” 分配位段成员的存储空间 。 (4)不能使用数组作位段成员 , 但位段变量可以是数组 。 (5)位段总长度 (位数 ), 是各个位段成员的长度 (位数 )之和 。 位段总长度可以超 过两个字 节 。 (6)一个结构体内可以在定义位段成员的同时定义其他非位段成员。结构体变 量的非位段成员要从一个新的字节开始分配存储空间,中间空闲的若干位将 不被使用。 第 4章 构造型数据类型 之 结构体 2 使用位段 位段成员的使用与结构体成员的使用相类 似 。 例如对于上述例子中定义的变量 x, 下面语 句是合法的: x a 7; x c 300; printf(“ d”, x.a+x.c2); 第 4章 构造型数据类型 之 结构体 说明: (1)位段可以进行赋值操作 , 所赋之值可以是整数 。 赋值时 , 应注意位 段允许的最大值范围 。 例如上面 x a定义的位段宽度为 3, 如果 x a 9; , 就错了 。 赋值语句中 , 赋值表达式的值超出位段的宽度时 , 则自动取值的低位赋值 。 9的二进制数是 1001, 而 x a的宽度只有三 位 , 取 1001的低 3位赋值给 x a, 因此赋值后 x a的值为 l, 而不是 9。 (2)位段可以按整型格式输出 , 可以在 printf函数中使用 ” d、 ” u、 ” o”、 “ x“等输出格式字符 。 (3)不能对位段成员求地址 , 因此也不能由键盘读入位段值 。 例如: 语句 scanf(“ u“, &x a);是非法的 。 (4)位段成员可以进行算术表达式的运算 , 系统自动将其转换成整型 。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!