C语言程序设计PPT课件第12章 结构体和共用体

合集下载

C语言中的结构体和共用体(联合体)

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讲 结构体共用体

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结构体与共用体

C语言程序设计课件0911结构体与共用体
typedef struct { int year, month, day; } Date; typedef struct { int num; char name[20], sex, addr[30]; float score; Date birthday; 这时定义结构体变 } Student; 量就不要写struct了。 Student st1, st2;
指向结构体变量的指针


格式: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

C语言程序设计教程ppt课件完整版pptx
C语言的应用领域
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
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语言程序设计教程完整全套教学课件pptx

C语言与高级语言的关系
探讨C语言与Java、Python等高级语 言之间的联系与区别,以及各自适用 的场景。
C语言的特点与优势
阐述C语言高效、灵活、可移植等特 点,以及在系统级编程、嵌入式开发 等领域的广泛应用。
计算机系统基本概念
1 2 3
计算机系统的组成
介绍计算机硬件系统的基本组成,包括中央处理 器、内存、输入/输出设备等。
强制类型转换
通过类型转换运算符来实现,其一般 形式为“(类型说明符)(表达式) ”,其功能是把表达式的运算结果强 制转换成类型说明符所表示的类型。
03
控制结构
顺序结构
顺序结构的概念
按照代码的先后顺序,逐行 执行程序。
顺序结构的流程图
用箭头表示程序执行的顺序 。
顺序结构的应用场景
适用于简单的计算和输出任 务。
局部变量和全局变量
局部变量
在函数内部定义的变量,只在该函数内有效,不同函数中的局部变量互不影响。
全局变量
在函数外部定义的变量,可以在整个程序范围内访问,但过度使用全局变量会降低程序的可维护性和可读性。
模块化设计思想
模块化设计概念
01
将程序划分为若干个独立的功能模块,每个模块完成
特定的功能,提高程序的可维护性和可重用性。
&&、||、!等
运算符和表达式
位运算符
&、|、^、~、<<、>>等
赋值运算符
=、+=、-=、*=、/=等
条件运算符
?
运算符和表达式
逗号运算符
,
表达式
由运算符和操作数组成的式子,用于计算一个值
数据类型转换
自动类型转换

结构体C程序设计课件

结构体C程序设计课件

结构体变量 结构体是一个构造类型,前面只是定义了结构体,形成了 一个新的数据类型。还需要使用该数据类型来定义变量。 结构体变量有两种声明形式。 第一种声明形式是在定义结构体后,使用结构体类型名声 明。例如
struct PersonInfo
{
int index;
char name[30];
short age;
结构体
结构体的定义 结构体变量 结构体成员及初始化 结构体大小
结构体的定义
结构体的定义如下
struct 结构体类型名 {
成员类型 成员名; …… 成员类型 成员名; };
struct就是定义结构体的关键字,结构体类型名是一种标识 符,该标识符代表一个新的变量,结构体使用花括号将成 员括起来,每个成员都有自己的类型,成员类型可以是常 规的基础类型,也可以是自定义类型,也可以是一个类类 型。
};
PersonInfo pInfo;
结构体成员及初始化
引用结构体成员有两种方式,一种是声明结构体变量后, 通过成员运算符“.”引用,一种是声明结构体指针变量, 使用指向“->”运算符引用。
(1)使用成员运算符“.”引用结构体成员一般形式如下: 结构体变量名.成员名 引用到结构体成员后,就可以分别对结构体成员进行赋值, 对于每个结构体成员就和使用普通变量一样。
(2)在定义结构体同时,可以同时声明结构体指针变量. 如果要引用指针结构体变量的成员,需要使用指向“->” 运算符。一般形式如下:
结构体指针变量->成员名
结构体的嵌套
定义完结构体后就形成一个新的数据类型,C++语言提供在 定义结构体时可以声明其它已定义好的结构体变量,也可 以在定义结构体时定义子结构体。

C语言程序设计结构体共用体及位运算PPT课件

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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) – 在复合数据类型基础上增加了对数据的操作
相关文档
最新文档