C语言程序设计第10章02PPT课件
合集下载
谭浩强C语言程序设计课件完整版第10章
10.3文件的读写
fputc(c,fp2); fclose(fp1); fclose(fp2); } system("cls"); printf("abc.txt:\n"); system("type abc.txt"); printf("\n\nxyz.txt:\n"); system("type xyz.txt"); */ } 运行结果如下:
10.2文件的打开与关闭
即先检查打开的操作有否出错,如果有错就在终端上输出 “cannot open this file”。Exit函数的作用是关闭所有文件,终 止正在调用的过程。待用户检查出错,修改后在运行。 2.文件的关闭(fclose函数) 使用完一个文件之后应该尽快关闭,以免数据丢失。 关闭一个文件使用fclose()函数实现,其格式如下: Fclose(文件指针) 文件指针:指明要关闭哪个文件,作为参数的文件指针必须是由打 开文件函数fopen()得到的。 例如: #include<stdio.h> main() { FILE *fp; … if(fp=fopen(“abc.txt,”“r”))==0) /*尝试打开文件*/
/* 调用DOS命令输出源文件内容*/ /* 调用DOS命令输出目标文件内容
10.3文件的读写
10.3.2 fgets()函数和fputs()函数
以字符为单位的fgetc()函数和fputc()函数一次只能读出或写入一个字 符到文件中,显然处理大量数据时效率不高,以字符串为单位的fgets()函 数和fputs()函数可以一次从文件输入或向文件输出一个字符串。 1.fgets ()函数 fgets()是从文件而不是从标准输入设备取得字符串。其格式如下: fgets(字符串指针,字符个数,文件指针); 其中第一个参数“字符串指针”,即一个字符组名或指向字符的指针, 用于存放读出的字符串;第二个参数指明读出多少个字符,是一个整型数; 第三个参数即目标文件的文件指针。 fgets()在遇到换行符或文件结束符时,即使已读取得字符数小于参数 中指定的数量也会自动停止。如程序设计者已经知道abc.txt文件不大于 100个字节,调用fgets()函数的第二个参数为100,使得整个文件被一次 读取。若abc.txt文件大于100字节,则后面的内容没有被读取。如果 fgets()读取到文件结束符,将会返回一个NULL值。可以据此判断是否到 达文件尾部,使用循环语句读出整个文件。若目标文件的结构不清晰,一 般使用fgetc()函数逐个字符读取,逐个处理。在预先知道目标文件结构的 情况下,使用fgets()函数能提高效率。
C语言程序设计第四版PPT-谭浩强
文件f2的 文件信息区
文件f3的 文件信息区
文件的基本知识——文件的操作 写文件:打开-写-关闭 读文件:打开-读-关闭
文件的打开
功能:为文件建立相应的信息区(存放 文件信息)和文件缓冲区(暂时存放输入 输出的数据) 函数: fopen(文件名,使用文件方式); 例: fopen("a1.dat","r");
第10章 文件
本章内容
10.1 文件的基本知识 10.2 打开与关闭文件 10.3 顺序读写数据文件 10.4 随机读写数据文件 10.5 文件读写的出错检测
文件的基本知识——输入输出
之前各章中处理的数据 ➢输入:键盘->内存 ➢输出:内存->显示器 实际上也可能是 ➢输入:外部设备->内存(读文件) ➢输出:内存->外部设备(写文件) 操作系统把各种设备都统一作为文件处理
文件
顺序文件的读写——读写字符串
例10.3 从键盘输入3个字符串,排序,把排
序后的字符串写入文件(P.342-343) 读上面写好的文件(P.344)
顺序文件的读写——格式化读写
fprintf(文件指针,格式字符串,输出表列); fscanf (文件指针,格式字符串,输入表列);
例: fprintf (fp,"%d,%6.2f",i,f); fscanf (fp,"%d,%f",&i,&f);
用文件扩展名”
文件的基本知识——流式文件
C语言把文件看作是字符(或字 节)的序列。
文件以“流”的形式在程序与操 作系统间流动。
文件的基本知识——数据的形式
根据数据的组织形式,数据文件可分为 ASCII文件:数据逐个字符的ASCII码 输出到外存,也称文本文件 二进制文件:内存中二进制形式的数据 直接输出到外存
《C语言程序设计教程》PPT课件
② 标准输出文件,文件指针为stdout,系统指定为 显示器。
③ 标准错误输出文件,文件指针为stderr,系统指 定为显示器,输出错误信息。
10.1 文件的概述
11
10.1.2 文件的打开与关闭
操作文件的一般步骤
打开文件 读写文件 关闭文件 打开量文的件函C:语数建配言,立一的用用个输于户文入完程件输成序缓出对与冲函数文区数据件。库文的中件联提的系供建,了立为大、文件分 读写数文据件的:读是写指、对数文据件的的追读加、等写操、作追。加和定位操作。 关闭文件在:程切序断中文调件用与这程些序函的数联时系,,必释须放先文用件缓冲
}
FFIILLE;E *文件指针变量/名* ;This is the FILE object */
10.1 文件的概述
10
10.1.1 文件和文件指针
4. 标准文件
标准文件是外部设备中的三个特殊的设备文件。它们 的文件指针是系统定义的,并由系统自动打开和关闭。这 三个标准文件分别是:
① 标准输入文件,文件指针为stdin,系统指定为 键盘。
include命区令。包含stdio.h文件。
10.1 文件的概述
12
10.1.2 文件的打开与关闭
1. 文件打开函数fopen( )
常用的调用形式: FILE *fp; fp = fopen(文件名, 文件使用方式); 文件名:需要打开的文件名称(字符串)。 文件使用方式:是具有特定含义的符号。
缓冲区cha地r 址和大小f等d; 。 /* File descriptor
*/
FILE在类usnhCso型语irgt是n言ed系中ch统a,r定无hb义os论li的dz;e对;,磁包//**盘含UBnu文g在fefte件scrtcs还dhiazi是reo.i设fh头n备o 文b文uf件*f件/er中*/
③ 标准错误输出文件,文件指针为stderr,系统指 定为显示器,输出错误信息。
10.1 文件的概述
11
10.1.2 文件的打开与关闭
操作文件的一般步骤
打开文件 读写文件 关闭文件 打开量文的件函C:语数建配言,立一的用用个输于户文入完程件输成序缓出对与冲函数文区数据件。库文的中件联提的系供建,了立为大、文件分 读写数文据件的:读是写指、对数文据件的的追读加、等写操、作追。加和定位操作。 关闭文件在:程切序断中文调件用与这程些序函的数联时系,,必释须放先文用件缓冲
}
FFIILLE;E *文件指针变量/名* ;This is the FILE object */
10.1 文件的概述
10
10.1.1 文件和文件指针
4. 标准文件
标准文件是外部设备中的三个特殊的设备文件。它们 的文件指针是系统定义的,并由系统自动打开和关闭。这 三个标准文件分别是:
① 标准输入文件,文件指针为stdin,系统指定为 键盘。
include命区令。包含stdio.h文件。
10.1 文件的概述
12
10.1.2 文件的打开与关闭
1. 文件打开函数fopen( )
常用的调用形式: FILE *fp; fp = fopen(文件名, 文件使用方式); 文件名:需要打开的文件名称(字符串)。 文件使用方式:是具有特定含义的符号。
缓冲区cha地r 址和大小f等d; 。 /* File descriptor
*/
FILE在类usnhCso型语irgt是n言ed系中ch统a,r定无hb义os论li的dz;e对;,磁包//**盘含UBnu文g在fefte件scrtcs还dhiazi是reo.i设fh头n备o 文b文uf件*f件/er中*/
精品课件-程序设计基础(C语言)(杨俊清)-第10章
第10章 文 件
typedef struct {
shortlevel; 的程度*/
unsigned flags; charfd; unsigned charhold; 读取字符*/ shortb size; unsigned char*buffer; 置*/ unsignedar *curp; unsigned istemp; short token;
if ((fp=fopen("file1","r"))==NULL) {
printf("cannot open this file\n"); exit(0); }
第10章 文 件
即先检查打开的操作有否出错,如果有错就在终端上输出 “cannot open this file”。exit函数的作用是关闭所有文 件,终止正在调用的过程。待用户检查出错误,修改后再运行。
第10章 文 件
第10章 文 件
10.1 文件概述 10.2 文件的读写 10.3 文件定位 习题
第10章 文 件
10.1 文 件 概 述 文件(file)是程序设计中一个重要的概念。所谓“文 件”,一般指存储在外部介质上数据的集合。一批数据是以文 件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为 单位对数据进行管理的,也就是说,如果想找存在外部介质上 的数据,必须先按文件名找到所指定的文件,然后再从该文件 中读取数据。要向外部介质上存储数据,也必须先建立一个文 件(以文件名标识),才能向它输出数据。
第10章 文 件
说明: (1) 用“r”方式打开的文件只能用于向计算机输入而不 能用作向该文件输出数据,而且该文件应该已经存在。不能用 “r”方式打开一个并不存在的文件(即输入文件),否则出错。 (2) 用“w”方式打开的文件只能用于向该文件写数据 (即输出文件),而不能用来向计算机输入。如果原来不存在该 文件,则在打开时新建立一个以指定的名字命名的文件。如果 原来已存在一个以该文件名命名的文件,则在打开时将该文件 删去,然后重新建立一个新文件。 (3) 如果希望向文件末尾添加新的数据(不希望删除原有 数据),则应该用“a”方式打开。但此时该文件必须已存在, 否则将得到出错信息。打开时,位置指针移到文件末尾。
高树芳C语言程序设计--第十章
[解决方案]定义结构体类型变量存储学生信息,
使用scanf从键盘输入数据,使用fprintf函数按格 式输出数据到文件(生成data3.txt文件)。
程序代码
10
10.2
文件的读写
相关知识:
1.文件的读写 2.格式化读写函数
11
10.2
文件的读写
[课堂训练10-1] 1.使用Windows的记事本建立一个文件,其 中写入15个任意整数,数据之间用逗号分隔。 编程输出该文件所有的奇数。 2.编程以只读方式打开案例10-3中的 data3.txt文件,在屏幕上输出所有学生的数 据。
第10章
文件
知识目标: 1. 理解文件和文件指针的概念 2.掌握文件的打开和关闭方法 3.掌握文件的读写操作 4.掌握文件的定位与随机读写操作
1
第10章 文件 能力目标: 1. 会打开和关闭文件 2.会对文件进行读写和定位等操作
本章内容: 文件的定义,文件型指针,文件的打开与关闭,文件 的读写,文件的定位与随机读写。
2
第10章 10.1 10.2 10.3 10.4
文件
文件的打开与关闭 文件的读写 文件的定位和随机读写 知识拓展
3
10.1 文件的打开与关闭
案例10-1
输出文件中的整数及其和
4
10.1 文件的打开与关闭
案例10-1 [案例任务]
输出文件中的整数及其和
使用Windows的记事本在磁盘上与C程序文件在同一目 录下建立一个文件名为“data1.txt”的文本文件(如 图10-1所示),以空格、制表符或回车为分隔符输入 任意个整数,设计C程序,以只读方式打开此文件,若 该文件不存在,则输出“不能打开文件!”,若打开 成功,则输出所有整数,以及整数的个数和它们之和。
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函数分配的内存空间,防 止内存泄漏。
动态规划思想
动态规划是一种在数学、计算机科学和经济学中 使用的,通过把原问题分解为相对简单的子问题 的方式来求解复杂问题的方法。动态规划常用于 优化重叠子问题的计算。
回溯与分支限界法
回溯法是一种通过探索所有可能的候选解来找出 所有解的算法,而分支限界法是一种通过剪枝来 减少搜索空间的优化算法。回溯与分支限界法常 用于解决组合优化问题。
计算机系统基本概念
计算机系统的组成 操作系统的基本概念 计算机中的数与编码
编程环境与工具安装配置
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语言课件第10章教学讲义ppt
➢完成一个学生成绩信息管理系统应用程 序的设计,该程序的操作界面。
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
电脑基础·实例·上机系列丛
“成绩浏览”功能区运行结果
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程
实现用户登录认证和用户登出功能
➢对数据库表数据进行添加或删除意味着改变 数据库的内容,在进行添加或删除数据信息 时应慎重,为了避免有人恶意添加或删除信 息,因此,只有具有此操作权限的人才能进 行操作,即在程序中,当用户需要进行添加 或删除数据信息操作时,要进行一个用户登 录认证,只有通过认证的用户才有权限进行 数据库内容的修改。
电脑基础·实例·上机系列丛
清华大学出版社
程序实现
Visual C++程序设计教程
➢(5)实现学生成绩信息浏览功能。 ➢(6)实现用户登录认证和用户登出功
能。 ➢(7)实现学生ห้องสมุดไป่ตู้绩信息添加功能。 ➢(8)实现学生成绩信息删除功能。
电脑基础·实例·上机系列丛
清华大学出版社
程序实现
Visual C++程序设计教程
电脑基础·实例·上机系列丛
清华大学出版社
Visual C++程序设计教程 建立一个带有ODBC数据库支持功能的单文档界面 的工程文件
➢建立一个带有ODBC数据库支持功能的 单文档界面的工程文件的操作步骤如下:
C语言程序设计ppt-第10篇-02
2019/11/19
华中科技大学计算机学院
6
void main(void) {
union chl u; printf("size of u is %d\n",sizeof(u)); u.l=0x31323334L; show(&u); show_memoy(&u); u.h=0x3638; show(&u); show_memoy(&u); }
由于语法上合法,编译器对这种情况不会报错,但运算的结 果却不正确。
假如在union chl中增加一个成员(其它都不变),如: float f;则在show函数中,如果执行语句为: printf("float format: %f\n",pu->f); 则得到是不正确的结果0.00,而其他语句中操作却是相容的。
如上面例子中的v={'9'}。也可以: union chl v={ˊ9ˊ},w={ˊaˊ};
2019/11/19
华中科技大学计算机学院
5
例10.12 通过例子对联合的特性 进行进一步分析。
#include "stdio.h" union chl{
char c; short h; long l; }; void show(union chl *pu); void show_memoy(union chl *pu);
字段结构在操作系统,编译程序,嵌入式系统的C语言编程方 面使用较多。
例如,stdio.h中关于文件状态成员flags的取值就规定了1为 读状态,2为写状态,4为缓冲数据状态等等。这些数据都是 一些值很小的整数,没有必要用int或char变量来存储每一个 值。
《C语言程序设计教程》课件--第10章
向文件写数据时,也是先将 变量中数据送到缓冲区,待缓 冲区装满后,再一起存到磁盘 文件中。
8
程序区
数据区
输入 输出 文件
缓冲区
内存
磁盘文件 输出
输入 外存
图10.2 系统对缓冲文件的处理
2019/10/29
10.1 文件的概述
9
10.1.1 文件和文件指针
3. 缓冲文件和文件指针
文件类型指针
在缓冲文件系统中,对每个正在使用的文件
exit(0); }
2019/10/29
10.2 文本文件的读写
21
10.2.1 文件的字符输入输出函数
while ((c=getchar( ))!=EOF)
/*键盘文件结束标志:输入Ctrl+z,显示^Z后回车*/
putc(c, fp);
/* 将键盘输入的字符写到文件中 */
fclose(fp);
”w”:只写方式
为写(输出)文本文件打开文件。若文件不存在, 则建立一个新文件;若文件已存在,则清空文件。
”a”:追加方式
为写(输出)文本文件打开文件。若文件已存在, 则保持原来文件的内容,将新的数据增加到原来数据 的后面;若文件不存在,则返回NULL。
2019/10/29
10.1 文件的概述
14
因此对uunnss于iiggnn每eedd 个cha使r 用*ics中utrepm的;p; 磁//**盘CTue文rmrpeo件nrta必rayc须ftiilv先ee pi定onidni义tceart一o*r/*/ 个FILshEo类rt 型的文件t指oke针n;变量/* 并Use指d f向or此val变id量ity。checking */
常①字用符p的u的t调c先函用数后形与顺式f序p:u进tc行函,数的只功能能在相操同作。了在第sitd个io.h文
8
程序区
数据区
输入 输出 文件
缓冲区
内存
磁盘文件 输出
输入 外存
图10.2 系统对缓冲文件的处理
2019/10/29
10.1 文件的概述
9
10.1.1 文件和文件指针
3. 缓冲文件和文件指针
文件类型指针
在缓冲文件系统中,对每个正在使用的文件
exit(0); }
2019/10/29
10.2 文本文件的读写
21
10.2.1 文件的字符输入输出函数
while ((c=getchar( ))!=EOF)
/*键盘文件结束标志:输入Ctrl+z,显示^Z后回车*/
putc(c, fp);
/* 将键盘输入的字符写到文件中 */
fclose(fp);
”w”:只写方式
为写(输出)文本文件打开文件。若文件不存在, 则建立一个新文件;若文件已存在,则清空文件。
”a”:追加方式
为写(输出)文本文件打开文件。若文件已存在, 则保持原来文件的内容,将新的数据增加到原来数据 的后面;若文件不存在,则返回NULL。
2019/10/29
10.1 文件的概述
14
因此对uunnss于iiggnn每eedd 个cha使r 用*ics中utrepm的;p; 磁//**盘CTue文rmrpeo件nrta必rayc须ftiilv先ee pi定onidni义tceart一o*r/*/ 个FILshEo类rt 型的文件t指oke针n;变量/* 并Use指d f向or此val变id量ity。checking */
常①字用符p的u的t调c先函用数后形与顺式f序p:u进tc行函,数的只功能能在相操同作。了在第sitd个io.h文
C语言程序设计第10章 编译预处理简明教程PPT课件
(2)定义一个宏名字之后,可以在其他宏定义中使用它。 如: #define ONE 1 #define TWO ONE+1 #define THREE ONE+TWO
计算机科学与技术学院—— C语言程序设计
10.2 #define
例10-1 宏定义及其使用 #define MESSAGE “You are right!\n”
计算机科学与技术学院—— C语言程序设计
第十章 编译预处理 内容提要
C预处理程序 #define
#include
条件编译指令
#undef
计算机科学与技术学院—— C语言程序设计
10.3 #include
10.3 #include
程序中的#include指令要求编译程序读入另一个源文件。被读入 文件的名字必须由双引号(”)或一对尖括号(<>)包围。如: #include”stdio.h” 或 #include<stdio.h> 都令编译程序读入并编译用于I/O函数处理的包含文件stdio.h。
计算机科学与技术学院—— C语言程序设计
10.3 #include
说明: (1)包含文件中还可以包含其它文件,称为嵌套包含(nested includes)。允许的最大嵌套深度随编译程序而变。 (2)用尖括号包围头文件时,搜索头文件时按编译程序的预先定 义进行,一般只搜索某些专门放置包含头文件的特殊目录。当头 文件用双引号包围时,搜索按编译程序实现时的规定进行,一般 指搜索当前目录,如未发现头文件,则再按尖括号包围时的办法 重新搜索。
10.2 #define
(4)#define指令还有一个重要功能:宏名字可以有变元。每当遇 到宏名字时,与之有关的变元都由程序中的实际变元替换。如上 例中的#define ABS(a) (a)<0?-(a):(a)。但要注意,#define ABS(a) (a)<0?-(a):(a)中变元a两边的括号是不能少的,否则, 会产生非预期结果。如: #define ABS(a) a<0?-a:a printf(”abs of (10-20):%d\n”,ABS(10-20)); ABS(10-20)替换为:10-20<0?-10-20:10-20,则输出结果为-30。
精品课件-C程序设计(第三版)(荣政)-第10章
第十章 文件
二进制文件是将数据按其在内存中的二进制形式直接存 入文件。 这种形式可以节省存储空间, 减少转换时间, 在 读/写大批数据时速度较快, 一般中间结果数据常用二进制 文件保存。
但二进制文件不能直接输出字符形式, 所以不便于阅读。
整数5678在两种不同文件中的存储形式如图10.1所示。 从图中可看出, 整数5678在ASCII码文件中占用了4个字节, 而在二进制文件中只占用了2个字节。
第十章 文件
数据流是对数据输入/输出(I/O)行为的一种抽象。各种 各样的终端设备或磁盘文件的细节是非常复杂多样的(例如磁 盘文件既允许顺序存取,又允许随机存取,而作为终端的设 备文件就只能顺序存取),直接对它们编程将会非常繁琐。引 入数据流的概念有效地解决了这一难题。只要建立了输入/输 出数据流,编程者在应用程序中就不需要关心底层输入/输出 设备或是任何磁盘文件的具体细节差异。程序中要输入数据, 只需从输入数据流中读入; 输出数据只需向输出数据流中写 出即可,这样就使程序完全与具体硬件资源脱离了关系,也 就是说数据流使C程序与具体系统完全不相关,使C程序可以 非常方便地移植。
第十章 文件
在一个程序开始执行时,三个预定义的文字流: stdin(标准输入)、stdout(标准输出)和stderr(标准出错) 就被打开,有的系统还同时打开stdprn(标准打印机)和 stdaux(标准辅助设备,大多数系统是控制台)。
对编程人员来说,所有的I/O通过流来进行。所有的 流都一样,都是一系列字符。文件I/O系统把流与文件, 也就是与有I/O功能的外部设备连接起来。C语言的I/O库 函数把来自设备的源信息转换到流之中,或反过来把流中 的信息转换给各设备。在C语言中,编程者只需记住流这 个概念,只使用一个文件系统就可以完成全部的I/O操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17.08.2020
华中科技大学计算机学院
4
10.7.2 联合变量的声明、初始化及 联合成员的引用
定义了union chl的联合类型后,可以通过: union chl u;
来声明一个union chl类型的变量。 也可以在定义union chl联合类型的同时来声明相应的联合变
量。如: union chl{ char c; short h; long l; }v={ˊ9ˊ};
它在定义union chl联合类型的同时声明了联合类型的变量v, 并且对其进行了初始化。
在不产生二义的情况下,往往简称联合类型的变量为联合。
17.08.2020
华中科技大学计算机学院
5
联合变量的声明、初始化
值得注意的是,联合变量的初始化与结构的初始化 在形式上相同,都应该用花括号界定初值,但联合 是一种特殊形式的构造类型的数据,在同一时刻它 只拥有其中的一个成员。
8
void show(union chl *pu)
{
printf("char format: %c\n",(*pu).c);
printf("int format: %hx\n",pu->h);
printf("long format: %lx\n",(*pu).l);
}
void show_memoy(union chl *pu)
17.08.2020
华中科技大学计算机学院
10
对程序和程序的运行结果可以做如下分析:
1) 联合的存储结构
从sizeof(u)的结果为4可以看出,联合u所占存储的 大小为4个字节,这正好是长整型成员l所占存储的大 小。这4个字节的存储是连续的,地址从0xFFD8至 0xFFDB。u.l 的值为0x31323334L,u的存储描述 为:
17.08.2020
华中科技大学计算机学院
3
如果有3个不同数据类型(char, short, long ) 的变量要分时共用一个共同的存储区域,则可
以定义如下的联合类型:
union chl{
char
c;
short h;
long
l;
};
这里chl是所定义的联合类型的联合名(tag) , 它 与union一起形成一个union chl的联合类型。c、h、 l是联合类型的成员。
{
char *p=(char *)pu;
int i=0;
while(i<4){
printf("addr %dth byte of u is 0x%p\t",i,p+i);
printf("the ASCII in %dth byte of u is %c\n",i,*(p+i));
i
the ASCII in 0th byte of u is 4 the ASCII in 1th byte of u is 3 the ASCII in 2th byte of u is 2 the ASCII in 3th byte of u is 1
the ASCII in 0th byte of u is 8 the ASCII in 1th byte of u is 6 the ASCII in 2th byte of u is 2 the ASCII in 3th byte of u is 1
17.08.2020
华中科技大学计算机学院
华中科技大学计算机学院
9
程序的运行结果如下:
size of u is 4 char format: 4 int format: 3334 long format: 31323334 addr 0th byte of u is 0xFFD8 addr 1th byte of u is 0xFFD9 addr 2th byte of u is 0xFFDA addr 3th byte of u is 0xFFDB char format: 8 int format: 3638 long format: 31323638 addr 0th byte of u is 0xFFD8 addr 1th byte of u is 0xFFD9 addr 2th byte of u is 0xFFDA addr 3th byte of u is 0xFFDB
C语言程序设计
The C Programming Language
17.08.2020
1
整体概况
+ 概况1
您的内容打在这里,或者通过复制您的文本后。
概况2
+ 您的内容打在这里,或者通过复制您的文本后。
概况3
+ 您的内容打在这里,或者通过复制您的文本后。
*10.7 联 合 10.7.1 联合类型的定义
union chl u; printf("size of u is %d\n",sizeof(u)); u.l=0x31323334L; show(&u); show_memoy(&u); u.h=0x3638; show(&u); show_memoy(&u); }
17.08.2020
华中科技大学计算机学院
与结构类似,联合类型也是一种构造类型。 一个联合类型中包含有多个成员,这些成员 共享共同的存储区域,但这些成员并不同时 存在;联合存储区域的大小由各个成员中所占 字节数最大的成员决定;在任何时刻,各个成 员中只能有一个成员拥有该存储。
除了用关键字union取代struct之外,联合类 型的定义、联合变量的声明、以及联合成员 的引用在语法上与结构完全相同。
因此,初始化时只能对联合的第1个成员进行初始化。 换言之,初值表中只能包含与第1个成员数据类型相 同的一个初值。
如上面例子中的v={'9'}。也可以:
union chl v={ˊ9ˊ},w={ˊaˊ};
17.08.2020
华中科技大学计算机学院
6
例10.12 通过例子对联合的特性 进行进一步分析。
#include "stdio.h" union chl{
char c; short h; long l; }; void show(union chl *pu); void show_memoy(union chl *pu);
17.08.2020
华中科技大学计算机学院
7
void main(void) {