C语言程序设计PPT课件第12章 结构体和共用体
C语言中的结构体和共用体(联合体)
C语言中的结构体和共用体(联合体)/c-pointer-array/在C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。
共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。
今天,我们来介绍一下C 语言中结构体和共用体的相关概念和使用。
结构体 / struct结构体的定义声明一个结构体类型的一般形式为:struct 结构体名 {成员列表};其中,成员列表中对各成员都应进行类型声明,即:类型名成员名;例如,我们需要在程序中记录一个学生(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所示:如果要表示图中的数据结构,但C 语言并没有提供这种现成的数据类型,因此我们需要用定义一种结构体类型来表示。
truct student {int num;char name[20];char sex;int age;float score;char addr[30];};上述定义了一个新的结构体类型 struct student(注意,struct 是声明结构体类型时所必须使用的关键及,不能省略),它向编译系统声明,这是一个“结构体类型”,它包括 num、name、sex、age、score、addr 等不同类型的数据项。
应当说,这里的 struct student 是一个类型名,它与系统提供的标准类型(如 int、char、float、double 等)具有同样的作用,都可以用来定义变量的类型。
结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。
C语言第12讲 结构体共用体
§6.3 结构体变量的引用
引用规则
结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例 struct 成员(分量)运算符 student 可以将一个结构体变量赋值给另一个结构体变量 例 struct student { stu1.num=10; int num; 优先级: 结构体嵌套时逐级引用 1 { int num; 例 struct student 结合性:从左向右 { char name[20]; int num; 例 struct name[20]; char sex; char student char name[20]; stu1.score=85.5; 例 structchar num; student { int sex; int char sex; age; printf(“%d,%s,%c,%d,%f,%s\n”,stu1); () if(stu1==stu2) { int age; num; stu1.birthday.month=12; char name[20]; float score; int …….. () stu1.score+=stu2.score; char score; name[20]; int age; struct float date char addr[30]; stu1.age++; float score; char addr[30]; stu1={101,“Wan Lin”,„M‟,19,87.5,“DaLian”}; () sex; { int char month; }stu1,stu2; addr[30]; char birthday int age; int }stu1,stu2; day; num name float score; }stu1,stu2; month day year int year; stu2=stu1; ( ) char addr[30]; }birthday; }stu1,stu2; }stu1,stu2;
C语言程序设计课件0911结构体与共用体
指向结构体变量的指针
格式:struct 结构体名 * 指针名; struct Item w={“friend”, 7}; struct Item *p; 上例可合并为: struct Item w={“friend”, 7}, *p;
指向成员运算符
可用指向结构体变量的指针来访问其成员, 这时要用到”指向成员运算符“,例如: struct Item w={“friend”, 7}, *p=&w; printf(“word=[%s], freq=%d\”, p->word, p->freq); // 此时等价于: w.word, w.freq 指向成员运算符与成员运算符的优先级都 是1,都是自左至右结合。
结构体类型的嵌套
struct Date { int year, month, day; }; struct Student { int num; char name[20], sex, addr[30]; float score; struct Date birthday; };
用typedef定义结构体类型名
结构体数组的定义
与结构体变量的定义方式类似,也有三种方 式,只需指明是数组即可。例如:
struct Item ws[3]; struct Item {char word[12]; int freq;} ws[3]; struct {char word[12]; int freq;} ws[3];
C语言程序设计教程ppt课件完整版pptx
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
01
常见的C语言编程环境
02
安装与配置C语言编译器
使用集成开发环境(IDE)进行C语言编程
03
第一个C程序:Hello, World!
01
C程序的基本结 构
02
编写Hello, World!程序
应用场景
适用于需要根据特定条件提前终 止循环或跳过某些循环操作的情 况。
04 函数与模块化设计
函数定义和调用
01
函数定义
包括函数名、参数列表、返回值 类型和函数体等部分,用于描述 函数的功能和实现细节。
函数调用
02
03
函数声明
通过函数名和参数列表来调用函 数,实现相应功能并获取返回值 。
在使用函数之前,需要对函数进 行声明,以便编译器识别函数的 存在和调用方式。
THANKS FOR WATCHING
感谢您的观看
指针运算符
包括取地址运算符&和取值运算符*,分别 用于获取变量的内存地址和通过指针访问内 存中的数据。
动态内存分配函数(malloc, free)使用方法
malloc函数
用于在堆区动态分配指定大小的内存空间,并返回 分配内存的起始地址。
free函数
用于释放之前通过malloc函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
C语言程序设计教程完整全套教学课件pptx
C语言与高级语言的关系
探讨C语言与Java、Python等高级语 言之间的联系与区别,以及各自适用 的场景。
C语言的特点与优势
阐述C语言高效、灵活、可移植等特 点,以及在系统级编程、嵌入式开发 等领域的广泛应用。
计算机系统基本概念
1 2 3
计算机系统的组成
介绍计算机硬件系统的基本组成,包括中央处理 器、内存、输入/输出设备等。
强制类型转换
通过类型转换运算符来实现,其一般 形式为“(类型说明符)(表达式) ”,其功能是把表达式的运算结果强 制转换成类型说明符所表示的类型。
03
控制结构
顺序结构
顺序结构的概念
按照代码的先后顺序,逐行 执行程序。
顺序结构的流程图
用箭头表示程序执行的顺序 。
顺序结构的应用场景
适用于简单的计算和输出任 务。
局部变量和全局变量
局部变量
在函数内部定义的变量,只在该函数内有效,不同函数中的局部变量互不影响。
全局变量
在函数外部定义的变量,可以在整个程序范围内访问,但过度使用全局变量会降低程序的可维护性和可读性。
模块化设计思想
模块化设计概念
01
将程序划分为若干个独立的功能模块,每个模块完成
特定的功能,提高程序的可维护性和可重用性。
&&、||、!等
运算符和表达式
位运算符
&、|、^、~、<<、>>等
赋值运算符
=、+=、-=、*=、/=等
条件运算符
?
运算符和表达式
逗号运算符
,
表达式
由运算符和操作数组成的式子,用于计算一个值
数据类型转换
自动类型转换
结构体C程序设计课件
结构体变量 结构体是一个构造类型,前面只是定义了结构体,形成了 一个新的数据类型。还需要使用该数据类型来定义变量。 结构体变量有两种声明形式。 第一种声明形式是在定义结构体后,使用结构体类型名声 明。例如
struct PersonInfo
{
int index;
char name[30];
short age;
结构体
结构体的定义 结构体变量 结构体成员及初始化 结构体大小
结构体的定义
结构体的定义如下
struct 结构体类型名 {
成员类型 成员名; …… 成员类型 成员名; };
struct就是定义结构体的关键字,结构体类型名是一种标识 符,该标识符代表一个新的变量,结构体使用花括号将成 员括起来,每个成员都有自己的类型,成员类型可以是常 规的基础类型,也可以是自定义类型,也可以是一个类类 型。
};
PersonInfo pInfo;
结构体成员及初始化
引用结构体成员有两种方式,一种是声明结构体变量后, 通过成员运算符“.”引用,一种是声明结构体指针变量, 使用指向“->”运算符引用。
(1)使用成员运算符“.”引用结构体成员一般形式如下: 结构体变量名.成员名 引用到结构体成员后,就可以分别对结构体成员进行赋值, 对于每个结构体成员就和使用普通变量一样。
(2)在定义结构体同时,可以同时声明结构体指针变量. 如果要引用指针结构体变量的成员,需要使用指向“->” 运算符。一般形式如下:
结构体指针变量->成员名
结构体的嵌套
定义完结构体后就形成一个新的数据类型,C++语言提供在 定义结构体时可以声明其它已定义好的结构体变量,也可 以在定义结构体时定义子结构体。
C语言程序设计结构体共用体及位运算PPT课件
个结构。成员可以在程序中单独使用,与普通变量完全相同。表示结构变量
成员的一般形式是:
•
结构变量名.成员名
•
例如:
•
jilu1.bianhao
/*记录1的编号
*/
• */
•
jilu2.xingbie
这有点像数据库中的字段。 第5页/共38页
/*记录2的性别
• 12.1.4 结构变量的赋值
• 完成。
结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来
放一个英文字母或符号,一个汉字通常要用两个字节来存储。每一个字节都
有自己的编号,叫做“地址”。一个字节由若干位(位的英文是bit)组成。
至于一个字节由几个位组成,取决于计算机的硬件系统。一般由8位、16位
或32位组成,所对应的计算机也被称为“8位机、16位机或32位机”。目
前微机以16位机或32位机为主。但在本书中作为原理讲述的是8位机。
•
我们把若干字节组成一个单元,叫做“字”(英文为word)。
一个字可以存放一个数据或指令。
第20页/共38页
• 2 原码
•
我们知道,计算机使用的是二进制数。但这些数据有不同的编码
方式,分别有原码、反码和补码。
•
以8位计算机系统为例,我们把最高位(即最左面的一位)留做
表示符号,其他7位表示二进制数,这种编码方式叫做原码。最高位为“0”
•
示例:如x=01010011,y=x>>2,则
y=00010100。
•
注意,左移会引起数据的变化,具体说,左移一位相当于对原来
的数值除以2。左移n位相当于对原来的数值除以2n。
• 4 按位与
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体的名字 称为结构体标 签(Structure Tag) 构成结构体的变量 称为结构体的成员
(Structure Member)
2020/8/17
11/60
结构体类型的声明
Don’t forget the
semicolon!!
2020/8/17
结构体模板
(Structure Template)
第12章 结构体和 共用体
本章学习内容
结构体数据类型,共用体数据类型,枚举数据类
型,定义数据类型的别名
结构体变量、结构体数组、结构体指针的定义和初
始化
结构体成员的引用,成员选择运算符,指向运算符 向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表
2020/8/17
2/60
2020/8/17
6/60
数组的解决方法
2020/8/17
7/60
数组的解决方法
2020/8/17
8/60
数组的解决方法
数据的内存管理方式
分配内存不集中,寻址效率不高
对数组赋初值时,易发生错位
2020/8/17
结构显得零散,不易管理
9/60
希望的内存分配图
2020/8/17
10/60
结构体类型的声明
且结构所占的实际空间一般是按照机器字长对齐的
不同的编译器、平台,对齐方式会有变化
结构体变量的成员的存储对齐规则是与机器相关的
具有特定数据类型的数据项大小也是与机器相关的
所以一个结构体在内存中的存储格式也是与机器相关的
2020/8/17
22/60
12.3结构体数组的定义和初始化
2020/8/17
23/60
【例12.2】
printf("%d\n", sizeof(struct sample)); printf("%d\n", sizeof(SAMPLE));
12
2020/8/17
21/60
12.2.7结构体所占内存的字节数
ch
f
ch
ch
f
ch12个字节
事实上,所有数据类型在内存中都是从偶数地址开始存放的
关键字typedef为一种 已存在的类型定义一个 别名,并未定义新类型
STUDENT与struct student类型是同义词
struct student stu1, stu2;/*It works*/
student sk?*/
struct stu1, stu2;
结构体定义 可以嵌套
2020/8/17
16/60
12.2.6结构体变量的引用
访问结构体变量的成员必须使用成员选择运算符 (也称圆点运算符)
当出现结构体嵌套时,必须 以级联方式访问结构体成员
2020/8/17
17/60
12.2.6结构体变量的引用
【例12.1】演示结构体变量的赋值和引用方法
按结构体的成员顺序逐 一对相应成员进行赋值
格式符%02d中2d前面的前导符0表示输
出数据时,若左边有多余位,则补0
2020/8/17
18/60
【例12.1】 若要从键 盘输入结 构体变量 stu1的内 容,那么 程序如何 修改?
2020/8/17
两个地址有何不同?
19/60
【例12.1】 若要从键 盘输入结 构体变量 stu1的内 容,那么 程序如何 修改?
/*Can this work?*/
STUDENT stu1, stu2;
2020/8/17
/*It works!*/
14/60
12.2.4结构体变量的初始化
等价于 等价于
2020/8/17
15/60
12.2.5嵌套的结构体
嵌套的结构体(Nested Structure)就是在一个 结构体内包含了另一个结构体作为其成员
形成一个类型声明的样板 用于生成结构体变量 但并未声明结构体变量 因而编译器不为其分配1内2/60存
12.2.2结构体变量的定义
(1)先定义结构体类型,再定义变量名
(2)在定义类型的同时定义变量 (3)直接定义结构体变量(不指定结构体标签)
2020/8/17
13/60
12.2.3用typedef定义数据类型
抽象数据类型进而进化为“类(Class)” – 这是一个跨时代的进步 – Class是Object-Oriented的一个重要概念
2020/8/17
5/60
12.2.1为什么要定义结构体类型
在程序里表示一个人(姓名、年龄、性别…), 怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?
等价于
STUDENT *pt = &stu1;
stu1 成员1 成员2 成员3 成员4
2020/8/17
结构体成员的地址与 该成员在结构体中所 处的位置及其所占内 存的字节数相关 结构体变量的地址 &stu2是该变量所占 内存空间的首地址
20/60
12.2.7结构体所占内存的字节数
struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
12.3结构体数组的定义和初始化
2020/8/1建7 立了数据库中的多条记录,每条对应一个学生信息24/60
2020/8/17
【例12.3】利用 结构体数组计 算每个学生的 平均分
25/60
12.4结构体指针的定义和初始化
如何定义指向结构体变量的指针?
pt STUDENT stu1; STUDENT *pt; pt = &stu1;
12.1从基本数据类型到抽象数据类型
二进制数——类型本不存在 – 内存里存的内容,你认为它是什么,它就
是什么
– 在早期的机器指令及汇编语言中,数据对
象均用二进制数表示,没有类型的概念
一般的CPU只支持两种类型 – 整数、浮点数
2020/8/17
3/60
12.1从基本数据类型到抽象数据类型
在高级语言引入了基本数据类型 – 整型、浮点型、字符型等 – 不同语言会定义不同的基本类型 – 基本数据类型并不能方便地解决所有问题
有些语言(如PL/1)中试图规定较多的类型, 如数组、树、栈等,但实践证明不是个好办法
2020/8/17
4/60
12.1从基本数据类型到抽象数据类型
用户自己构造数据类型-复合数据类型 – 由基本数据类型迭代派生而来,表示复杂的数据对象
典型的代表就是“结构体”
抽象数据类型(Abstract Data Type,简称ADT) – 在复合数据类型基础上增加了对数据的操作