C语言:第11章 复杂数据类型
更新时间:2023-08-31 20:35:01 阅读量: 教育文库 文档下载
C语言:第11章 复杂数据类型
第11章 11章
复杂数据类型
制作人:王敬华 制作人:
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
第11章:复杂数据类型 11章学习的意义整 型 短整型short 短整型short 整型int 整型int 长整型long 长整型long 单精度型float 单精度型float 双精度型double 双精度型double
只能定义单一的 数据类型, 数据类型,反映 事物单一属性
基本类型
实型
如定义学生成绩: 如定义学生成绩: float score; 能定义复杂的数 据类型,反映事 据类型, 物多个属性
字符类型char 字符类型char第 十 一 章 复 杂 数 据 类 型
C 数组 复杂数据类型丰富了C语言对数据信息的处理能力. 复杂数据类型丰富了C语言对数据信息的处理能力. 数 结构体struct 结构体 离开了复杂数据类型,struct 如定义学生信息: 如定义学生信息: 据 离开了复杂数据类型,很多信息的描述是无法进行定 构造类型 struct STU 义,更无法进行处理的. union 共用体union 共用体 类 更无法进行处理的. { 型 计算机中的信息表示更多是由复杂数据类型来定义的, 计算机中的信息表示更多是由复杂数据类型来定义的, 枚举类型enum 枚举类型enum char no[9]; //学号 //学号 指针类型 课程中的链表,树,图等 数据结构》 象《数据结构》课程中的链表, char name[12]; //姓名 //姓名 可以更好地理解数据库中的记录的含义, 可以更好地理解数据库中的记录的含义,sex; char //性别 //性别 空类型void 空类型void C++语言中类的概念的理解提供了帮助 score; 语言中类的概念的理解提供了帮助. 为C++语言中类的概念的理解提供了帮助. float //成绩 //成绩 定义类型typedef 定义类型typedef } student;
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
学习目标熟练掌握结构体,共用体和枚举数据类型的定义方法; 熟练掌握结构体,共用体和枚举数据类型的定义方法; 熟练掌握结构体,共用体和枚举变量的定义和引用方法; 熟练掌握结构体,共用体和枚举变量的定义和引用方法; 掌握结构数组的定义及其应用; 掌握结构数组的定义及其应用; 掌握指向结构的指针的概念及其应用; 掌握指向结构的指针的概念及其应用; 了解线性链表的创建,插入节点, 了解线性链表的创建,插入节点,删除节点和撤销节点的 算法; 算法; 掌握利用复杂数据类型作为函数参数和返回值的函数定义 方法; 方法;
第 十 一 章 复 杂 数 据 类 型
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
学习内容复杂数据类型概述 结构体 结构体类型的定义 结构体变量的定义和引用 结构体变量的赋值 简化结构体类型名 结构体数组 线性链表 联合体 联合体类型的定义 联合体变量的定义和引用 联合体变量的赋值 位域 枚举类型变量的定义和引用 复杂数据类型应用综合举
例 本章小结
第 十 一 章 复 杂 数 据 类 型
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
11. 11.1 结构体结构体是一种构造数据类型 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-------------自定 用途:把不同类型的数据组合成一个整体-------自定 义数据类型 引入结构体的好处: 引入结构体的好处:加强数据项之间的联系 如学生的基本信息,包括学号,姓名,性别,年龄, 如学生的基本信息,包括学号,姓名,性别,年龄,班 成绩等数据项. 级,成绩等数据项.这些数据项描述了一个学生的几个不同 侧面. 侧面.no name sex age classno grade
独立的变量表示: 独立的变量表示:第 十 一 章 复 杂 数 据 类 型
char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade;
//学号 //学号 //姓名 //姓名 //性别 //性别 //年龄 //年龄 //班级 //班级 //成绩 //成绩
数据项之间无关联 结构体变量表示: 结构体变量表示:no name sex age classno grade
数据项为一个整体
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
1,结构体类型的定义struct [结构体类型名] 结构体类型名] { 数据类型名1 成员名1 数据类型名1 成员名1; 数据类型名2 成员名2 数据类型名2 成员名2; …… 数据类型名n 成员名n 数据类型名n 成员名n; };
struct是关键字 struct是关键字, 是关键字, 不能省略 成员类型可以是 基本型或构造型
合法标识符 可省: 可省:无名结构体
第 十 一 章 复 杂 数 据 类 型
例 1: struct Student_Info { char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade; };
以分号; 以分号;结尾
//学号 //学号 //姓名 //姓名 //性别 //性别 //年龄 //年龄 //班级 //班级 //成绩 //成绩
例 2: struct Date { int year; //年 //年 int month; //月 //月 int day; //日 //日 };
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
在结构体中数据类型相同的成员,既可逐个, 在结构体中数据类型相同的成员,既可逐个,逐行分别 定义,也可合并成一行定义,就象一次定义多个变量一样. 定义,也可合并成一行定义,就象一次定义多个变量一样.struct Student_Info { struct Student_Info char no[9]; //学号 //学号 { char name[20]; //姓名 //姓名 char no[9], name[20], sex; char sex; //性别 //性别 unsigned int age, classno; unsigned int age; //年龄 //年龄 float grade; unsigned int classno; //班级 //班级 注意:结构类型只是用户自定义的一种数据类型, 注意:结构类型只是用户自定义的一种数据类型,用 }; float grade; //成绩 //成绩 来定义描述结构的组织形式,不分配内存, }; 来定义描述结构的组织形式,不分配内存,只有用它来定
第 十 一 章 复 杂 数 据 类 型
义某个变量时, 义某个变量时,才会为该变量分配结构类型所需要大小
的内存单元. 的内存单元.struct Date { int year; //年 //年 int month; //月 //月 int day; //日 //日 }; struct Date { int year, month, day; };
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
2,结构体变量的定义和引用 结构体变量的定义 间接定义法:先定义结构类型,再定义结构变量 间接定义法:先定义结构类型,struct 结构体类型名 { 数据类型名1 成员名1 数据类型名1 成员名1; …… 数据类型名n 成员名n 数据类型名n 成员名n; }; struct 结构体类型名 变量名列表; 变量名列表;
no name sex age classno grade
9字节 20字节 20字节 1字节 2字节 2字节 4字节
… … … … … …
第 十 一 章 复 杂 数 据 类 型
例:
struct Student_Info { char no[9], name[20], sex; unsigned int age, classno; float grade; }; struct Student_Info student;
内存映像 (BC下 (BC下)
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
一次定义多个结构体类型变量struct Student_Info student1, student2;
定义指向结构体类型的指针变量struct Student_Info *pstu;
※ 间接定义法中几种错误的结构体变量的定义方法struct student; 没有结构体类型名
第 十 一 章 复 杂 数 据 类 型
Student_Info student; 缺省struct关键字 缺省struct关键字 struct Point p; struct Point { int x, y; };
结构类型Point定义 结构类型Point定义 在后
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
2,结构体变量的定义和引用 结构体变量的定义 直接定义法: 直接定义法:定义结构体类型的同时定义结构体变量struct [结构体类型名] 结构体类型名] { 数据类型名1 成员名1 数据类型名1 成员名1; …… 数据类型名n 成员名n 数据类型名n 成员名n; } 变量名列表; 变量名列表; struct Student_Info { char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade; } student1, student2; student2;
无名结构体定义, 无名结构体定义, 变量只能一次
第 十 一 章 复 杂 数 据 类 型
//学号 //学号 //姓名 //姓名 //性别 //性别 //年龄 //年龄 //班级 //班级 //成绩 //成绩
或
struct { char no[9]; char name[20]; char sex; unsigned int age; unsigned int classno; float grade; } student1, student2; student2;
//学号 //学号 //姓名 //姓名 //性别 //性别 //年龄 //年龄 //班级 //班级 //成绩 //成绩
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
几点说明: 几点说明: (1) 结构体类型与结构体变量概念不同 类型: 不分配内存; 变量: 类型: 不分配内存; 变量: 分配内存 类型: 不能赋值,存取,运算; 变量: 类型: 不能赋值,存取,运算; 变量: 可以 (2) 结构体可以嵌套struct Point 例结构类型中的成员名,可以与程序中的变量同名, : (3) 结构类型中的成员名,可以与程序中的变量同名,它们 { student struct date 代表不同的对象, 代表不同的对象,互不干扰 { int x, y; (4)int month;
结构体类型及变量的作用域和生存期与基本类型变量相 }; num; birthday 同int day;Img Student_Info student; name struct struct char name[20]; birthday num num name month day { int year; structchar name[20]; date month day }; int tag; { struct Img //正确 正确, structmonth; *pimg; //正确,可以包含自身类型的指针 int student struct //错误,不能包含自身类型的变量 //错误 错误, { int day; Img img; }; int num; int year; char name[20]; } birthday; birthday; birthday; } struct date birthday; stu; } stu; year year
第 十 一 章 复 杂 数 据 类 型
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
结构体变量的引用 引用规则 成员(分量) 成员(分量)运算符 结合性: 结合性:从左向右 结构体变量不能整体引用 (分量)运算符 不能整体引用, 分量) 结构体变量不能整体引用,只能引用变量成员 成员( 成员 引用方式: 引用方式:结合性: 结合性:从左向右 结构体变量名. 结构体变量名.成员名 //非指针型结构体变量的引用 //非指针型结构体变量的引用 结构体指针结构体指针->成员名 或 (*结构体指针).成员名 结构体指针) //指针型结构体变量的引用 //指针型结构体变量的引用 例 struct student stu1.birthday.month = 12; { struct 例 struct student student 例 struct 例 struct student student 例 stu1.num = 10; 可以将一个结构体变量赋值给另一个结构体变量 可以将一个结构体变量赋值给另一个结构体变量 strcpy int num; {例 struct student (http://www.77cn.com.cn, "zhangMing"); { { { { char结构体嵌套时逐级引用 intname[20];int num; num; int num; 结构体嵌套时逐级引用 if>birthday.year \=(√)stu1); (×) int num; printf("%d,%s,%c,%d,%f,%s\ (√ printf("%d,%s,%c,%d,%f,%s n", (stu1 = stu2 Stu2 stu2) struct date char int num;stu.score -=(stu1 ==stu1;) n",stu1); (× char name[20]; name[20]; pstu1 stu1.score = 85.5;2008; char name[20];pstu1- 80; char name[20]; char name[20]; …….. (× (×) 结构体变量名. 结构体变量名 成员名.子成员名……最低级子成员名 { char sex; char sex; .成员名.子成员名……最低级子成员名 char sex; char sex; char int month; int age; sex; ->score += 10; int age; int age; pstuint age; int age;pstu int day; float score; float score; float score; float score; stu1.score += stu2.score; birthday float score; char addr[30]; num name int year; 注意:在利用指针引用结构体成员时, http://www.77cn.com.cn, (*pstu).score); 之间不能有空格. 注意:在利用指针引用结构体成员时,-和>之间不能有空格. char addr[30]; stu1={101,"Wan Lin",'M',19,87.5,"DaLian"}; (×) char addr[30]; ("%s %f", char addr[30]; char addr[30]; printf stu1.age++; day year (× month }}birthday; ;=} &stustu2; ; birthday; } stu1, stu2; stu, *pstu &stu; stu2 stu1,; stu2; } stu1, stu2 stu2; } &stu1; stu2; } stu1, stu2, *pstu = stu1, stu2; &stu1;
第 十 一 章 复 杂 数 据 类 型
C语言:第11章 复杂数据类型
C语 言 程 序 设
计 教 程 第 二 版
3,结构体变量的赋值 结构体变量初始化赋值 先定义结构体类型, 先定义结构体类型,再定义结构体变量时赋初值struct 结构体类型名 初值表 struct Date { … … }; }; { struct 结构体类型名 变量名 = {成员1的值, …, 成员n的值}; {成员 的值, 成员1 成员n的值} int year; //年 //年 int month; //月 //月 注意:赋初值时,{ }中间的数据顺序必须与结构体成员 注意 //日 int day; :日 // 赋初值时, }中间的数据顺序必须与结构体成员 的定义顺序一致,否则就会出现混乱. 的定义顺序一致,否则就会出现混乱. }; struct Stu_Info struct Student_Info stu = {"20020306", "ZhangMing", 'M', 18, 1, 90}; { char no[9]; //学号 //学号 sex age classno grade char name[20]; //姓名 //姓名 no name char sex; //性别 //性别 struct Student_Info stu = {18, "ZhangMing", 'M', "20020306", 1, 90}; struct Date birthday; //生日 //生日 unsigned int classno; //班级 //班级 float grade; //成绩 //成绩 }; struct Stu_Info stu = {"20020306", "ZhangMing", 'M', {1986, 12, 10}, 1, 90};
第 十 一 章 复 杂 数 据 类 型
√
×
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
3,结构体变量的赋值 结构体变量初始化赋值 定义结构体类型的同时, 定义结构体类型的同时,定义结构体变量并赋初值struct [结构体类型名] 结构体类型名] { 初值表 …… } 变量名 = {成员1的值,成员2的值, …, 成员n的值}; {成员 的值,成员2的值, 成员1 成员n的值} struct Date struct struct Student_Info { 或 { { int year, month, day; int year, month, day; //学号 //学号 }char birthdayno[9]; 12, 10}; = {1986, } birthday = {1986, 12, 10}; char name[20]; //姓名 //姓名 char sex; //性别 //性别 unsigned int age; //年龄 //年龄 unsigned int classno; //班级 //班级 float grade; //成绩 //成绩 } student = {"20020306", "ZhangMing", 'M', 18, 1, 90};
第 十 一 章 复 杂 数 据 类 型
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
3,结构体变量的赋值 结构体变量在程序中赋值 如果在定义结构体变量时并未对其赋初始值, 如果在定义结构体变量时并未对其赋初始值,那么在程 序中要对它赋值的话,就只能一个一个地对其成员逐一赋值 逐一赋值, 序中要对它赋值的话,就只能一个一个地对其成员逐一赋值, 或者用已赋值的同类型的结构体变量对它赋值 或者用已赋值的同类型的结构体变量对它赋值struct Student_Info stu; strcpy (stu.no, "20020306"); strcpy (http://www.77cn.com.cn, "ZhangMing"); stu.sex = 'M'; stu.age = 18; stu.classno = 1; stu.grade = 90; struct Student_Info stu1; stu1 = stu; 逐一赋值
第 十 一 章 复 杂 数 据 类 型
strcpy (stu1.no, stu.no); strcpy (http://www.77cn.com.cn, http://www.77cn.com.cn); stu1.sex = stu.sex; stu1.age = stu.age; stu1.classno = stu.classno; stu1.grade = stu.grade stu.grade;
利用已赋值的结构 memcpy (&stu1, &stu, sizeof(struct Stude
nt_Info)); 体变量赋值
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
【例】 计算学生5门课的平均成绩,最高分和最低分. 计算学生5门课的平均成绩,最高分和最低分.#include <stdio.h> struct score m.avegrade = 0; { m.maxgrade &m.grade[i]的运算顺序: &m.grade[i]的运算顺序= m.grade[0]; 的运算顺序: float grade[5]; m.mingrade float avegrade, maxgrade, mingrade;= m.grade[0]; for (i = 0; i < 5; i++) //求平均分,最高分,最低分 //求平均分 最高分, 求平均分, }; ]同优先级 同优先级, 注: .和[ ]同优先级,具 &m.grade[i] { 有左结合性,高于& 有左结合性,高于&的 m.avegrade += m.grade[i]; void main ( ) ① 优先级 m.maxgrade = (m.grade[i] > m.maxgrade) ? { m.grade[i] : m.maxgrade; ② int i; m.mingrade = (m.grade[i] < m.mingrade) ? struct score m; ③ printf ("input the grade of five course:\n"); course:\ m.grade[i] : m.mingrade; }//输入5门课的成绩 for (i = 0; i < 5; i++) //输入 输入5 m.avegrade /= 5; scanf ("%f", &m.grade[i]); printf ("avegrade = %5.1f maxgrade = %5.1f mingrade = %5.1f\n", %5.1f\ 运行结果( 门课的成绩为: 80 86 90 68 ): ): 运行结果(设5门课的成绩为:75m.avegrade, m.maxgrade, m.mingrade); } avegrade = 79.8 maxgrade = 90.0 mingrade = 68.0
第 十 一 章 复 杂 数 据 类 型
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
4,结构体变量内存分配问题透析 结构体变量定义以后, 结构体变量定义以后,系统会为其分配一定大小的内存空 但分配内存空间的大小与C 间,但分配内存空间的大小与C语言程序所处的编译环境有密 切的关系. 切的关系. 基于TC BC环境下的结构体变量内存分配 TC或 基于TC或BC环境下的结构体变量内存分配 struct MyStruct 内存分配方法: TC或BC编译环境 内存分配方法:在TC或BC编译环境 { 下,结构体变量所占内存空间的大小等 double x; 于它所包含的每个成员所占内存空间大 char y; 小之和. 小之和. int z; } a;
第 十 一 章 复 杂 数 据 类 型
sizeof(a) = sizeof(a.x) + sizeof(a.y) + sizeof(a.z) = 8 + 1 + 2 = 11(byte) 11(byte) 或 sizeof(struct MyStruct) = sizeof(double) + sizeof(char) + sizeof(int) = 8 + 1 + 2 = 11(byte) 11(byte)
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
基于TC BC环境下的结构体变量内存分配 基于TC或BC环境下的结构体变量内存分配 TC或 struct MyStruct { 结构体变量a的内存分配示意图: 结构体变量a的内存分配示意图: double x; 0 char y; 1 int z; 2 } a; 3 a.x(8 byte) byte)4
a(11 byte) byte)第 十 一 章 复 杂 数 据 类 型
5 6 7 8 9 10
a.y(1 byte) byte) a.z(2 byte) byte)
C语言:第11章 复杂数据类型
C语 言 程 序 设 计 教 程 第 二 版
基于VC 基于VC环境下的结构体变量内存分配 VC环境下的结构体变量内存分配 在VC环境下,结构体变量分配内存的方式与TC或BC是不 VC环境下,结构体变量分配内存的方式与TC BC是不 TC或 环境下 同的, 同的,其所占
内存空间的大小不一定等于结构体变量所包含 的每个成员所占内存空间大小之和. 的每个成员所占内存空间大小之和. struct MyStruct { double x; char y; int z; } a;
问:sizeof(a) = ? 16
第 十 一 章 复 杂 数 据 类 型
VC对变量存储的一个特殊处理. VC对变量存储的一个特殊处理.为 对变量存储的一个特殊处理 了提高CPU的存储速度,VC对结构体中 CPU的存储速度 了提高CPU的存储速度,VC对结构体中 的成员变量的起始地址做了"对齐" 的成员变量的起始地址做了"对齐"处 在默认情况下,VC规定各成员变量 理.在默认情况下,VC规定各成员变量 存放的起始地址相对于结构的起始地址 的偏移量必须为该成员变量类型所占用 的字节数的倍数. 的字节数的倍数.
正在阅读:
C语言:第11章 复杂数据类型08-31
温哥华街头的爱作文800字07-11
计算机接口技术05-04
高考数学一轮复习:第2章 函数、导数及其应用 第9讲01-30
机械制图及计算机绘图--试题库2016版04-03
七年级书法课教案09-05
我是电视控作文600字07-14
让高中英语词汇教学传播正能量01-01
名师张永生解析国考申论试题05-11
社区党支部书记党建工作专项述职报告06-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 复杂
- 语言
- 类型
- 数据
- 八年级英语下册教案Unit 9 Have you ever been to a museum
- 基金风险等级评价体系基金风险等级评价体系基金风险等...
- 8下条件状语从句练习
- 直接引语间接引语
- 沈萍微生物学第十二章
- 实证创新思维在物理实验设计大赛中的运用
- 文化产业创意与策划总复习整理版
- 中级经济师考试《经济基础知识》题库1000题
- 2017-2022年中国金属罐行业深度研究报告(目录)
- 2019高中生物第6章从杂交育种到基因工程第2节基因工程及其应用学案新人教版必修2
- 2012考研政治马克思主义哲学知识框架
- 毛概笔记整理
- 提高心性
- 八年级英语上册Module6AnimalsindangerUnit2TheWWFisworkinghardtosavethemall课时训练1(新版)外研版
- 小流域综合治理规划大纲
- unit4 3课时
- 个人廉政日常谈话提纲
- 员工管理系统项目需求分析报告
- g16.2.2(3)分式的加减3(综合运算)
- 《数字电子技术(第三版)》3. 布尔代数与逻辑函数化简