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规定各成员变量 存放的起始地址相对于结构的起始地址 的偏移量必须为该成员变量类型所占用 的字节数的倍数. 的字节数的倍数.

本文来源:https://www.bwwdw.com/article/g3xi.html

Top