第十二章C语言中用户标识符的

上传人:M****1 文档编号:585012531 上传时间:2024-09-01 格式:PPT 页数:97 大小:393.52KB
返回 下载 相关 举报
第十二章C语言中用户标识符的_第1页
第1页 / 共97页
第十二章C语言中用户标识符的_第2页
第2页 / 共97页
第十二章C语言中用户标识符的_第3页
第3页 / 共97页
第十二章C语言中用户标识符的_第4页
第4页 / 共97页
第十二章C语言中用户标识符的_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《第十二章C语言中用户标识符的》由会员分享,可在线阅读,更多相关《第十二章C语言中用户标识符的(97页珍藏版)》请在金锄头文库上搜索。

1、第十二章C语言中用户标识符的作用域和存储类知识点1:局部变量与全局变量1.局部变量又称内部变量。全局变量又称外部变量。2.在函数内部或复合语句内部定义的变量称局部变量,形参也是局部变量,其作用域从定义的位置开始到本函数或本复合语句结束。3.在函数外部定义的变量称全局变量,其作用域从定义的位置开始到本源文件结束。4.在同一个源文件中不同函数中的局部变量可以同名,不同复合语句中的局部变量可以同名。1n n5.5.在同一个源文件中,全局变量可以和局部变量同名,在同一个源文件中,全局变量可以和局部变量同名,局部变量将屏蔽同名全局变量。局部变量将屏蔽同名全局变量。n n6.6.在函数体外进行的函数原型说

2、明也使该函数具有全局在函数体外进行的函数原型说明也使该函数具有全局的性质,其有效范围是从说明处起到源文件结束。的性质,其有效范围是从说明处起到源文件结束。n n 例如:例如:n n int a;int a;n n int f(int x,int y) int f(int x,int y)n n int j; j=a; int j; j=a;n n n n main() main()n nint x,y;int x,y;n n x=a; x=a;n n 2n n知识点2:变量的存储类别n n1.C语言中,有两种存储类别:一种是自动类,一种是静态类。n n2.局部变量既可以说明成自动类,也可以说明

3、成静态类。全局变量只能是静态类。n n3.存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)和extern(外部)。n n4.存储类别说明符的说明形式:通常与类型名一起出现,可以放在类型名左边或右边。n n例如:auto int i,j; 也可写成 int auto i,j;3n n知识点3:局部变量及其作用域和生存期n n1.auto变量n n当在函数内部或复合语句内定义变量时,如果没有指定存储类或使用了auto说明符,系统就认为所定义的变量具有自动类别。因此,n n float a;等价于 auto float a;n n auto变量的存储单元被分配

4、在内存的动态存储区。每当进入函数体(或复合语句)时,系统自动为auto变量分配存储单元。退出时自动释放这些存储单元。因此,这类局部变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止。4n n例如:例如:n n sub(float a)sub(float a)n n int i; int i;n n n n if(i0) if(i0)n n int n; int n;n n n n printf( printf(“ “%dn%dn” ”,n);,n);n n n n n n n n这里,变量这里,变量i,a,ni,a,n都是都是autoauto变量。但变量。但i i和和a a的作用域是

5、整的作用域是整个个subsub函数;而函数;而n n的作用域仅限于的作用域仅限于ifif子名内。子名内。5n n生存期:所有自动类局部变量的存储单元都是在进入这些局部变量所在的函数体(或复合语句)时生成,退出其所在的函数体(或复合语句)时消失。n n2.register变量n n寄存器变量也是自动类变量。它与auto变量的区别仅在于:用register变量是将变量的值保留在CPU的寄存器中,而不是象一般变量那样,占内存单元。特点:程序运行速度快,因为访问寄存器比访问内存快。n n注意:(1)CPU中寄存器的数目有限,只能说明少量寄存器变量。n n(2)register变量的值存放在寄存器中,因

6、此不能对register变量进行求地址运算。6n n例:以下函数power用以计算xnn n main()n n int s;n n s=power(5,3);n n printf(“%dn”,s);n nn npower(int x, register int n)n n register int p;n n for(p=1; n;n-) p=p*x;n n return p;7n n3.静态存储类的n n当在函数体(或复合语句)内部,用static来说明一个变量时,可以称该变量为静态局部变量。静态局部变量作用域与auto,register类的变量一样。n n区别(1)在整个程序运行期间,静

7、态局部变量在内存的静态存储区中占所着永久性的存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留,由此可知,静态局部变量的生存期将一直延长到程序运行结束。8n n(2 2)静态局部变量的初值是在编译时赋予的,在程序)静态局部变量的初值是在编译时赋予的,在程序执行期间不再赋予初值。对未赋初值的静态局部变量,执行期间不再赋予初值。对未赋初值的静态局部变量,C C编译程序自动给它赋初值编译程序自动给它赋初值0.0.n n例:以下程序输出结果例:以下程序输出结果n n int x=3;int x=3;n n main

8、() main()n n int i; int i;n n for(i=1;ix;i+) incre(); for(i=1;ix;i+) incre();n n int incre() int incre()n n static int x=1; static int x=1;n n x*=x+1; x*=x+1;n n printf(“ %d”,x); printf(“ %d”,x);n n n nA.3 3A.3 3B.2 2B.2 2C.2 6C.2 6D.2 5D.2 59n n知识点知识点4 4:全局变量及其作用域和生存期:全局变量及其作用域和生存期n n全局变量只有静态一种类别。对

9、于全局变量可使用全局变量只有静态一种类别。对于全局变量可使用externextern和和staticstatic两种说明符。两种说明符。n n1.1.全局变量的作用域和生存期全局变量的作用域和生存期n n全局变量是在函数外部任意位置上定义的变量,它的作全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止。用域是从变量定义的位置开始,到整个源文件结束止。例如:例如:n n int sum;int sum;n n main( ) main( )n n sum+; sum+;n n int fun1() int fun1()n n sum+; sum+;n

10、n int test; int test;n n int fun2() int fun2()n n sum+;test=1; sum+;test=1;10n n全局变量的生存期是整个程序的运行期间。若全局变量和某一函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内访问的是局部变量。n n例:有以下程序n n int a=3;n n main()n nint s=0;n n int a=5;s+=a+;n n s+=a+; printf(“%dn”,s);n n程序运结果n nA. 8B.10C. 7D.1111n n2.2.在同一编译单位内用在同一编译单位内用externexte

11、rn说明符来扩展全局变量的说明符来扩展全局变量的作用域。作用域。n n当全局变量定义在后,引用它的函数在前时,应该在引当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用用它的函数中用externextern对此全局变量进行说明,以便通对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,知编译程序:该变量是一个已在外部定义了的全局变量,这时其作用域从这时其作用域从externextern说明处起,延伸到该函数末尾。说明处起,延伸到该函数末尾。n n fun1()fun1()n n n n extern int x; extern int x;n n fun2

12、() fun2()n n int a; a=x; int a; a=x; n n int x,y; int x,y;n n main() main()n n x=2; x=2; 12n n3.3.静态全局变量静态全局变量n n当用当用staticstatic说明符说明全局变量时,此变量可称作说明符说明全局变量时,此变量可称作“静静态态”全局变量。全局变量。静态全局变量只限于本编译单位使用,静态全局变量只限于本编译单位使用,不能被其它编译单位所引用。不能被其它编译单位所引用。n n例:例:n n/*file1.c*/ /*file2.c*/ /*file1.c*/ /*file2.c*/ n n

13、static int n; extern int n;static int n; extern int n;n n void func(); void func() void func(); void func()n n main() main() printf(“%file2:%dn”,);printf(“%file2:%dn”,);n n n=5; n=5; n nprintf(“file1:%dn”,n); printf(“file1:%dn”,n); n n func(); func();n n 13n n知识点5:函数的类别n n所有函数都是外部的,因为不允许在函数内部定义另一个函数

14、。但当定义函数时,可以使用extern或static说明符。n n1.一般的函数都隐含说明符extern.此说明的特征是:可以被其他编译单位中的函数调用。n n2.若在函数返回值的类型前加上说明符static,则称此函数为“静态”函数。此类函数的特征是:只限于本编译单位的其他函数调用它,而不允许其他编译单位中的调用它。14n n12-1以下程序的输出结果n n main()n n int i=2,j=3;n n printf(“%d,”,i+);n n int i=0;n n i+=j*2;n n printf(“%d,%d,”,i,j);n n n n printf(“%d,%dn”,i,j

15、);n nn nA.1,6,3,1,3 B.1,6,3,2,3n nC.1,6,3,6,3 D.1,7,3,2,315n n12-2以下程序的输出结果是n n int m=13;n n int fun2(int x,int y)n n int m=3;n n return(x*y-m);n nn nmain()n n int a=7,b=5;n n printf(“%dn”,fun2(a,b)/m);n nn nA. 1B.2C.7D.1016第十三章编译预处理和动态存储分配第十三章编译预处理和动态存储分配n n在C语言中,凡是以”#“号开头的行,都称为“编译预处理”命令行。在此之前我们常用的

16、由#include,#define开始的程序行就是编译预处理命令行。C语言预处理命令有:#undef,#if,#else等等。这些预处理命令组成的预处理命令行必须在一行的开头以“#”号开始,每行的末尾不得加“;”。17n n知识点1:不带参数的宏定义n n1.不带参数的宏定义命令行形式如下:n n #define 宏名替换文本n n或#define 宏名n n例:#define PI 3.14156n n对于以上例举的宏名PI,在编译时将把一串文本3.15156去替换源程序中的PI。n n(1)同一宏名不可重复定义。n n(2)替换文本不能替换双引号中与宏名相同的字符串。例如,如果YES是已定

17、义的宏名,则不能用与它相关的替换文本来替换printf(“YES”)中的YES.18n n(3)替换文本并不替换用户标识符中的成分。例如,宏名YES,不会替换标识符YESORNO中的YES。n n(4)用作宏名的标识符通常用大写字母表示,这并不是语法规定,只是一种习惯。n n(5)在C程序中,宏定义的定义位置一般写在程序的开头。19n n知识点2:带参数的宏定义n n1.带参数的宏定义命令行形式如下:n n #define 宏名(形参表) 替换文本n n例:n n #define MU(X,Y) (X)*(Y)n n n n a=MU(5,2);n n b=6/MU(a+3,a);n n等价于

18、n n a=(5)*(2);n n b=6/(a+3)*(a);20n n(1)宏名和左括号之间不得有空格,形参之间用逗号隔开,替换文本中通常应包含有形参。n n(2)调用带参的宏时,括号中实参的个数应与形参的相同。编译时,编译预处理程序用“替换文本”来替换宏名,用对应实参不加任何改动地替换“替换文本”中的形参。n n(3)宏调用和函数调用有相似之处,但宏调用由编译预处理程序完成的,没有计算过程。n n(4)宏调用中,实参不能替换括在双引号中的形参。21n n知识点3:文件包含n n1.文件包含命令可有以下两种形式n n#include “文件名”n n#include n n2.文件包含命令

19、行的作用n n预编译时,预编译程序将用指定文件中的内容来替换此命令行。如果文件名用双引号括起来,系统先在源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到有关目录中去寻找。如果文件名用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录中去寻找。22n n3.#include命令行应书写在所用文件的开头,因此也把包含文件称作“头文件”。头文件名可以由用户指定,其后缀不一定用“.h”。n n4.包含文件中,一般包含有一些公用的#define命令行、外部说明或对(库)函数的原型说明。例如:“stdio.h”就是这样的文件。n n5.当包含文件修改后,对包含文件的源程序

20、必须重新进行编译连接。n n6.在一个程序中,允许有任意多个#include命令行。n n7.在包含文件中还可以包含其他文件。23n n知识点4:动态存储分配n n静态存储分配:我们用存储数据的变量和数组都必须在说明部分进行定义。C编译程序通过定义语句了解它们所需存储空间大小,并预先为其分配适当的内存空间。这些空间一经分配,在变量或数组的生存期内是固定不变的。n n动态存储分配:在程序执行期间需要空间来存储数据时,通过“申请”分配指定的内存空间。n nC为动态分配系统定义了四个函数,它们是malloc,calloc,free和realloc。使用这些函数时,必须在程序开头包含头文件stdio.

21、h。本书只介绍malloc,calloc和free函数的使用。24n n1.malloc函数n n其函数原型为void * malloc(unsigned int);n nmalloc函数返回值的类型为void *,函数调用形式为:malloc(size)。要求size的类型为unsigned int。n n其作用是在内存的动态存储区中分配一个长度为size的连续空间。如果此函数未能成功地执行,则返回空指针(NULL)。n n我们知道int型占2字节,float型占4字节,则以下程序段将使pi指向一个int类型的存储单元,使pf指向一个float类型的存储单元。25n n int *pi;n

22、n float *pf;n n pi=(int *)malloc(2);n n pf=(float *)malloc(4);n n 由于malloc函数返回的地址为void *(无值型),故在调用函数时,必须利用强制类型转换将其转换成所需的类型。此处括号中的*号不可少,否则就转换成普通变量类型而不是指针类型了。n n 若不能确定数据类型所占字节数,可以使用sizeof运算符来求得。例如:n n pi=(int *)malloc(sizeof(int);n n pf=(float *)malloc(sizeof(float);26n n2.free2.free函数函数n n其函数原型为其函数原型

23、为void free(void *p);void free(void *p);n n函数调用形式为:函数调用形式为:free(p);free(p);这里指针这里指针p p必须指向由动态必须指向由动态分配函数分配函数mallocmalloc分配的地址。分配的地址。freefree函数将指针函数将指针p p所指的所指的存储空间释放,使这部分空间可以由系统重新支配。此存储空间释放,使这部分空间可以由系统重新支配。此函数没有返回值。函数没有返回值。n n3.calloc3.calloc函数函数n n其函数原型为其函数原型为n nvoid * calloc(unsigned n,unsigned siz

24、e);void * calloc(unsigned n,unsigned size);n n函数调用形式为:函数调用形式为:calloc(n,size);calloc(n,size);n ncalloccalloc函数用来给函数用来给n n个同一类型的数据项分配连续的存个同一类型的数据项分配连续的存储空间。每个数据项的长度为储空间。每个数据项的长度为sizesize个字节。若分配成功,个字节。若分配成功,函数返回存储空间的首地址;否则返回空。由调用函数返回存储空间的首地址;否则返回空。由调用calloccalloc函数所分配的存储单元,系统自动置初值函数所分配的存储单元,系统自动置初值0 0。

25、27n n例如:n n char *ps;n n ps=(char *)calloc(10,sizeof(char);n n以上函数调用语句开辟了10个连续的char类型的存储单元,由ps指向存储单元的首地址。每个存储单元可以存放一个字符。n n使用calloc函数开辟的动态存储单元,同样用free函数释放。形式同malloc。28第十四章结构体、共用体和用户定义类型n n目前为止,我们已经介绍了C语言中的基本类型(整型、字符型、实型、双精度型和空值型)以入派生类型(指针和数组)。本章将介绍C语言中可由用户构造的三种数据类型。n n1.用户定义类型(typedef):对已有的类型,另外说明一个

26、新的类型标识符。n n2.结构体(struct):把具有相互关系的不同类型的数据组成一个有机的整体。n n3.共用体(union):又称联合体。使几种不同类型的变量共用一段存储空间。29n n知识点1:用typedef说明一种新类型名n n用typedef说明一个新的类型标识符的一般形式如下:n n typedef 类型名 标识符;n n在此,“类型名”必须是已有类型标识符,“标识符”是一个用户定义标识符,用作新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并未产生新的数据类型。原有类型名依然有效。例如: typedef int INTEGER;该语句把一个用户

27、命名的标识符INTEGER说明成了一个int类型的类型名。在此说明后,可以用INTEGER定义整型变量。如: INTEGER m,n;等价于 int m,n;30n n又如: typedef char * CHARP;n n CHARP p;等价于 char *p;n n14-1若有以下说明和定义n n typedef int * INTEGER;n n INTEGER p,*q;n n以下叙述正确的是n nA.p是int型变量n nB.p是基类型为int的指针变量n nC.q是基类型为int的指针变量n nD.程序中可用INTEGER代替int类型名31n n14-2若要说明一个类型名STP

28、,使得定义语句n nSTP s;等价于char *s;,以下选项中正确的是n nA.typedef STP char *s;n nB.typedef *char STP;n nC.typedef STP *char;n nD.typedef char *STP;32n n知识点2:结构体类型n n结构体类型由若干个称为成员的成分组成。对于 某个具体的结构体类型,成员的数量必须固定,这与数组相同;但该结构体中各个成员的类型可以不同,这与数组区别。n n例如:我们常用的“日期”可由以下三部分描述:年(year),月(month),日(day)。可以把这三个成员组成一个整体,并给它取名为date,这

29、就是一个简单的结构体。n n再如:以学生档案为例,若包括如下数据项:n n姓名(name):字符串;性别(sex):字符型n n出生日期(birthday):date 结构体;n n四门课成绩(sc):一维实型数组;可将这四个成员组成一个名为student的结构体。33n n1.结构体类型说明的一般形式n n struct 结构体标识名n n 类型名 结构成员名;n n n n ;n n(1)struct是关键字,是结构体类型的标志。n n(2)结构体标识名是用户定义的标识符.可以省略,构成一个无名结构体类型。n n(3)结构体成员名是用户定义标识符,可以与其他变量名和和其他结构体中的成员名同

30、名。n n(4)结构体成员可以是简单类型,数组,指针或已说明过的结构体等n n(5)结构体类型说明最后分号不可省略。34n n例如:上述日期的结构体类型可以说明如下:n n struct daten n int year, month,day;n n上述学生档案的结构体类型可以说明如下:n n struct studentn n char name12;n n char sex;n n struct date birthday;n n float sc4;n n;n n以上说明中,birthday成员的类型struct date是一个已说明过的结构体类型。35n n若没有事先说明这一类型,以上

31、结构体类型说明可改写成如下形式:n n struct studentn n char name12;n n char sex;n n struct n n int year;n n int month;n n int day; birthday;n n float sc4;n n;36n n2.2.结构体类型的变量、数组和指针变量的定义结构体类型的变量、数组和指针变量的定义n n可以用以下四种方式定义结构体类型的变量、数组和指可以用以下四种方式定义结构体类型的变量、数组和指针变量:针变量:n n(1 1)紧跟在结构体类型说明之后进行定义。例:)紧跟在结构体类型说明之后进行定义。例:n n st

32、ruct studentstruct studentn n char name12; char name12;n n char sex; char sex;n n struct date birthday; struct date birthday;n n float sc4; float sc4;n n std,per3,*pstd; std,per3,*pstd;n n此处在说明结构体类型此处在说明结构体类型struct studentstruct student的同时,定义了的同时,定义了一个结构体变量一个结构体变量std,std,具有具有3 3个元素的结构体数组个元素的结构体数组per

33、spers和和基类型为结构体类型的指针变量基类型为结构体类型的指针变量pstdpstd。37n n变量变量stdstd的结构如图的结构如图具有这一结构类型的变量中只能存放一组数据(即一个学具有这一结构类型的变量中只能存放一组数据(即一个学生的档案)。生的档案)。如果要存放多个学生的数据,就要使用结构体类型的数组。如果要存放多个学生的数据,就要使用结构体类型的数组。以上定义的数组以上定义的数组perspers就要以存放三名学生的档案。它每就要以存放三名学生的档案。它每一个元素都是一个一个元素都是一个struct studentstruct student类型的变量。类型的变量。以上定义的指针变量

34、以上定义的指针变量pstdpstd可以指向具有可以指向具有struct studentstruct student类类型的存储单元,但目前还没有具体的指向。型的存储单元,但目前还没有具体的指向。38n n(2)在说明一个无名结构体类型的同时,直接进行定义。例如:以上定义的结构体中可以把student略去,写成:n nstructn n char name12;n n char sex;n n struct date birthday;n n float sc4;n n std,per3,*pstd;n n这种方式与前一种的区别仅仅是省去了结构体标识名。39n n(3)先说明结构体类型,再单独进

35、行变量定义。例如:n nstruct studentn n char name12;n n char sex;n n struct date birthday;n n float sc4;n n;n nstruct student std,per3,*pstd;40n n(4)使用typedef说明一个结构体类型名,再用新类型名来定义变量。例如:n n typedef struct n n char name12;n n char sex;n n struct date birthday;n n float sc4;n nSTREC;n nSTREC std,pers3,*pstd;n n此处

36、STREC是一个具体的结构体类型名。它能够唯一的标识这种结构体类型。因此,可用它来定义变量,如同使用int,char一样,不可再写关键字struct.41n n3.给结构体变量、数组赋初值n n(1)给结构体变量赋初值n n所赋初值顺序放在一对花括号中,例如:n nstruct studentn n char name12;n n char sex;n n struct date birthday;n n float sc4;n nstd=“Li Min”,”M”,1962,5,10,88,76,85,92;42n n赋初值后,变量std的内容如图n n对结构体变量进行赋初值时,C编译程序按每

37、个成员在结构体中的顺序一一对应赋初值;不允许跳过前边的成员给后面的成员赋初值;但可以只给前面的若干个成员赋初值,对于后面未赋初值的成员,对于数值型和字符型数据,系统自动赋初值零。43n n(2)给结构体数组赋初值n n给结构体数组赋初值的规则与给数组赋初值规则相同。只是由于结构体数组中的每个元素都是一个结构体,因此通常将其成员放在一对花括号中,以便区分各个元素.例如:n n struct bookcardn n char num;n n float money;n nbk3=“NO.1”,35.5,“NO.2”,38.0, “NO.3”,35.5;44n n4.引用结构体变量中的数据n n(1

38、)对结构成员的引用n n若已定义了一个结构体变量,和基类型为同一结构体类型的指针变量,并使该指针指向同类型的变量,则可用以下三种形式来引用结构体变量中的成员。n n结构体变量名.成员名n n指针变量名-成员名n n(*指针变量名).成员名n n其中点号为成员运算符;箭头为结构指向运算符;在第三种形式中,一对圆括号不可少。45n n例:n nstruct studentn n char name12;n n char sex;n n struct date birthday;n n float sc4;n nstd,arr5,*ps;n nps=&std;n n若要引用结构体变量std中的sex

39、成员,可写作:n n std.sex 通过结构体变量引用 n n ps-sex 通过指针变量引用n n (*ps).sex 通过指针变量引用46n n若要引用结构体数组arr的第0个元素arr0中的sex成员,可写作arr0.sex。不能写成arr.sex。n n若要引用结构体变量std中数组成员sc中的元素sc2时,可写作std.sc2或ps-sc2或(*ps).sc2或arr0.sc2。不能写成std.sc。n n若结构体变量中的成员是作为字符串使用的字符型数组,如结构体中的成员name,由于可以将其看作“字符串变量”,因此其引用形式可以是std.name或ps-name或(*p).nam

40、e或arr0.name.47n n内嵌结构体变量成员的引用n n访问结构体变量中各内嵌结构体成员时,必须逐层使用成员名定位。例如:引用结构体变量std中的出生年份时,可写作std.birthday.year或ps-birthday.year或(*ps).birthday.year或arr0.birthday.year。注意birthday不能用-运算符,因为birthday不是指针变量。.n n(2)对结构体变量中的成员进行操作n n结构体变量中的每个成员都属某个具体的数据类型。因此,对结构体变量中的每个成员,都可以象普通变量一样,对它进行同类变量所允许的任何操作。例:变量std中的成员std

41、.name是字符串型,可以对它进行任何字符串允许的操作。48n n若有定义:n nstruct student std,pers5,*pstd;n n pstd=&std;n n以下对相应变量中的name成员所进行的操作合法。n n scanf(“%s”,std.name);或gets(std.name);n n scanf(“%s”,pstd-name);或gets(pstd-name);n n for(i=0;isex);或std-sex=getchar();n nfor(i=0;ibirthday.year);n nfor(i=0;i3;i+) scanf(“%d”,&persi.bir

42、thday.year);n nstd.birthday.year=1962;50n n以下对相应变量中成员数组sc中的元素进行操作n nfor(j=0;j5;j+) scanf(“%f”,&std.scj);n nfor(j=0;jscj);n nfor(i=0;i3;i+)n n for(j=0;ja等价于+(p-a)使得a增1,因为运算符-的优先级高于+。若要在访问a之前使p增1,应当写成(+p)-a或p+ -a。52n n相同类型结构体变量之间的整体赋值n n struct n n char name10;n n int num;n n per1,per2=“YANGGM”,46;n n

43、执行语句:per1=per2;后,per2中每个成员的值都赋给了per1中对应的同名成员。这种方法必须保证赋值号两边结构体变量的类型相同。 53n n5.函数之间结构体变量的数据传递n n(1)向函数传递结构体变量的成员n n在前面指出:结构体变量中的每个成员可以是简单变量、数组或指针变量等,作为成员变量,它们可以参与所属类型允许的任何操作。这一原则在参数传递中仍适用。n n(2)向函数传递结构体变量n n结构体变量可作为实参将结构体变量的值传送给相应的形参。n n(3)传递结构体的地址n n将结构体变量的地址作为实参传递给形参,这时对应的形参应该是一个基类型相同的结构体类型的指针。54n n

44、例:通过函数给结构体成员赋值n n typedef struct n n cahr s10;n n int t;n nST;n ngetdata(ST *p) 形参为结构体类型的指针变量n n scanf(“%s%d”,p-s,&p-t);n n main()n n ST a;n n getdata(&a); 结构体变量的地址作实参n n printf(“%s,%dn”,a.s,a.t);n n55n n(4)函数的返回值是结构体类型n n书上例14.2通过函数返回结构体类型的值。n n(5)函数的返回值可以是指向结构体变量的指针类型。n n书上例14.3、14.456n n6.6.利用结构体

45、变量构成链表利用结构体变量构成链表n n(1 1)链表概述)链表概述n n链表是一种常见的数据结构。它是动态地进行存储分配链表是一种常见的数据结构。它是动态地进行存储分配的一种结构。如图表示最简单的一种链表的结构的一种结构。如图表示最简单的一种链表的结构. .n n链表有一个链表有一个“头指针头指针”变量,图中以变量,图中以headhead表示,它存放表示,它存放一个地址。该地址指向一元素。链表中每一个元素称为一个地址。该地址指向一元素。链表中每一个元素称为“结点结点”,每个结点都应包括两个部分:一为用户需要,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。可以看出,

46、用的实际数据,二为下一个结点的地址。可以看出,headhead指向第一个元素;第一个元素又指向第二个元素指向第一个元素;第一个元素又指向第二个元素直到最后一个元素,称它为直到最后一个元素,称它为“表尾表尾”,且地址部分为,且地址部分为“NULL”NULL”。57n n可以看到链表中各元素在内存中可以不是连续存放的。要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素。如果不提供“头指针”(head),则整个链表都无法访问。n n这种链表的数据结构,必须利用指针变量才能实现。即:一个结点中应包含一个指针变量,用于存放下一结点的地址。n n前面介绿了结构体变量,用它作链表

47、中的结点是最合适的。一个结构体变量包含若干成员,这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型。我们用这个指针类型成员来存放下一个结点的地址。例如:58n n struct studentn n int num;n n float score;n n struct student *next;n n;n n其中成员num和score用来存放结点中的有用数据,相当于上图结点中的A,B,C,D。next是指针类型的成员,它指向struct student类型数据。一个指针类型的成员既可以指向其他类型的结构体数据,也可以指向自己所在结构体类型的数据。现在,next是struct stu

48、dent类型中的一个成员,它又指向struct student类型的数据。用这种方法就可以建立链表。59n n如果所示n n图中每个结点都属于struct student类型,它的成员next存放下一结点的地址,程序设计人员可以不必具体知道各结点的地址,只要保证将下一个结点的地址放到前一结点的成员next中即可。这种从当前结点找到后继结点的链表,称为“单向链表”。60n n例:建立一个如上图所的链表,它由例:建立一个如上图所的链表,它由4 4个学生数据的结点组成,个学生数据的结点组成,并输出各结点中的数据。并输出各结点中的数据。n n#define NULL 0#define NULL 0n

49、nstruct studentstruct studentn nlong num;long num;n n float score; float score;n n struct student *next; struct student *next;n nmain()main()n nstruct student a,b,c,d,*head,*p;struct student a,b,c,d,*head,*p;n n a.num=99101;a.score=89.5; b.num=99103;b.score=90; a.num=99101;a.score=89.5; b.num=99103;

50、b.score=90;n n c.num=99105;c.score=85; d.num=99107;d.score=80; c.num=99105;c.score=85; d.num=99107;d.score=80;n n head=&a; a.next=&b;b.next=&c;c.next=&d;d.next=NULL; head=&a; a.next=&b;b.next=&c;c.next=&d;d.next=NULL;n n p=head; p=head;n n do don nprintf(“%ld,%5.1fn”,p-num,p-score);printf(“%ld,%5.1f

51、n”,p-num,p-score);n n p=p-next; while (p!=NULL); p=p-next; while (p!=NULL);61n n(2)在单向链表中插入结点n n在单链表中插入结点,首先要确定插入的位置。当插入结点插在指针p所的结点之前称为“前插”,当插入结点插在指针p所指的结点之后称为“后插”。如图所示“前插”操作过程中各指针的指向。n n当进行“前插”操作时,需要三个工作指针:图中用s来指向新开辟的结点;用p指向插入的位置;q指向s的前趋结点。n ns-next=p; q-next=s;62n n(3)删除单向链表中的结点n n为了删除单向链表中的某个结点,首

52、先要找到待删结点的前趋结点;然后将此前趋结点的指针去指向待删结点的后续结点;最后释放被删结点所占存储空间即可。如图所示删除结点操作。n nq-next=p-next;63n n知识点3:共用体n n共用体的类型说明和变量的定义方式和结构体的类型说明和变量定义的方式完全相同,不同的是,结构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有成员占有同一个存储空间。n n1.共用体类型的说明和变量定义n n(1)共用体类型的说明n n一般形式:n n union 共用体名n n类型名 共用体成员名;n n ;64n n例如:n n union un_1n n int i;n n float

53、x;n n char ch;n n;n n其中union是关键字,是共用体类型的标志。un_1是共用体名,“共用体名”和“共用成员名”都是由用户定义的标识符,按语法规定,共用体名是可选项,在说明中可以不出现。共用体中的成员可能是简单变量,也可以是数组、指针、结构体和共用体(结构体的成员也可以是共用体)。65n n(2)共用体变量的定义n n和结构体相似,共用体变量的定义也可以采用四种方式。取其一示例如下:n nunion un_1n n int i;n n float x;n ns1,s2,*p;n n这里变量s1的存储空间如图所示66n n说明:n n 共用体类型变量的定义,在形式上与结构体

54、非常相似,但它们是有本质区别的:结构体中的每个成员分别占有独立的存储空间,因此结构体变量所占内存字节数,是其成员所占字节数的总和;而共用体变量中的所有成员共享一段公共存储区,所以共用体变量所占内存字节数与其成员中占字节数最多的那个成员相等。若int型占2字节,float型占4字节,则以上定义的共用体变量占4字节,而不是6字节。 n n 由于共用体变量中的所有成员共享存储空间,因此变量中的所有成员的首地址相同,而且变量的地址也就是该变量成员的地址。例如:&s1=&s1.i=&s1.x。67n n2.2.共用体变量的引用共用体变量的引用n n(1 1)共用体变量中成员的引用)共用体变量中成员的引用

55、n n 共用体变量中每个成员的引用方式与结构体完全共用体变量中每个成员的引用方式与结构体完全 相同。可以使用以下三种形式之一:相同。可以使用以下三种形式之一:n n共用体变量名共用体变量名. .成员名成员名n n指针变量名指针变量名-成员名成员名n n(* *指针变量名)指针变量名). .成员名成员名n n例如:若例如:若s1,s2,ps1,s2,p的定义如前,且有的定义如前,且有p=&s1:,p=&s1:,则则s1.i,s1.x,s1.i,s1.x,或或p-i,p-x,(*p).i,(*p).xp-i,p-x,(*p).i,(*p).x都是合法的引都是合法的引用形式。用形式。n n 共用体中

56、的成员变量同样可参与其所属类型允许的共用体中的成员变量同样可参与其所属类型允许的任何操作。但在访问共用体成员时应注意:共用体变量任何操作。但在访问共用体成员时应注意:共用体变量中起作用的是最近一次存入的成员变量的值,原有成员中起作用的是最近一次存入的成员变量的值,原有成员变量的值将被覆盖。变量的值将被覆盖。68n n例如:n nunion un_1n n int i;n n int x;n ns1;n nmain()n nn n s1.x=123;n n s1.i=100;n n printf(%dn,s1.x);n n69n n(2)共用体变量的整体赋值n n例如:n n s1.i=5;n

57、n s2=s1;n nprintf(“%dn”,s2.i);n n输出的值为5.n n(3)向函数传递共用体变量的值n n同结构体变量一样,共用体类型的变量可以作为实参进行传递,也可以传送共用体变量的地址。n n例如:利用共用体类型的特点分别取出int变量中高字节和低字节中的两个数。70n n union changen n char c2;n n int a; n n un;n n main()n n un.a=16961;n n printf(“%d,%cn”,un.c0,un.c0);n n printf(“%d,%cn”,un.c1,un.c1);n nn n共用体变量un中包含两个成

58、员:字符数组c和整数变量a,它们恰好都占两个字节的存储单元。由于是共用存储单元,给un的成员a赋值后,内存中数据的存储情况如图所示71n n当给成员un.a赋16961后,系统将按int整型把数存放到存储空间中:分别输出un.c1,un.c0即完成把一个int整型数分别按高字节和低字节输出。72第十五章位运算n n知识点知识点1 1:位运算符:位运算符n n1.1.位运算符及功能位运算符及功能运算符含义优先级按位求反1右移2&按位与3按位异或4|按位或573n n知识点2:位运算符的运算功能n n1.“按位取反”运算()n n功能:是将把运算对象的内容按内容取反:即每一位上的0变1;1变0。例

59、如:表达式0115是将八进制数115按位求反。由于是“位”运算,为了直观起见,我们把运算对象直接用二进制形式表示:n n 01001101n n 结果 1011001074n n2.“左移”运算()n n左移运算符是双目运算符。运算符左边是移位对象;右边是整型表达式,代表左移的位数。左移时,右端(低位)补0;左端(高位)移出的部分舍弃。例如:n n char a=6,b;n n b=a2;n n用二进制数来表示运算过程如下:n n a:00000110 (a=6)n nb=a)n n右移运算符使用方法与左移运算符一样,所不同的是移右移运算符使用方法与左移运算符一样,所不同的是移位方向相反。右移

60、时,右端(低位)移出的二进制数舍位方向相反。右移时,右端(低位)移出的二进制数舍弃;左端(高位)移入的二进制数分两种情况:对于无弃;左端(高位)移入的二进制数分两种情况:对于无符号整数和正整数,高位补符号整数和正整数,高位补0 0;对于负整数,高位补;对于负整数,高位补1 1。这是因为负数在机器内均用补码表示。例如:这是因为负数在机器内均用补码表示。例如:n n int a=-714000,b;int a=-714000,b;n n用二进制数表示的运算过程如下:用二进制数表示的运算过程如下:n n 符号位符号位n na a的二进制原码表示:的二进制原码表示:1 11110011 0000000

61、01110011 00000000n na a的二进制补码表示:的二进制补码表示:1 10001101 000000000001101 00000000n nb=a2 : b=a2 : 1 11100011 01000000(b1100011 01000000(b的补码的补码) )n nb b的二进制原码表示:的二进制原码表示:1 10011100 110000000011100 11000000n nb b的八进制娄的八进制娄 :-016300-01630076n n4.“按位与”运算(&)n n运算符&的功能:把参加运算的两个运算数,按对应的二进制位分别进行“与”运算,当两个相应的位都为1

62、时,该位的结果为1;否则为0.例如,表达式12&10的运算如下:n n 12:00001100n n &10: 00001010n n结果:0000100077n n5.“按位异或”运算()n n异或运算的功能:参与运算的两个运算数中相对应的二进制位上,若数相同,则该位的结果为0;数不同,则该位的结果为1。例如:n n 00110011n n 11000011n n结果:1111000078n n6.“按位或”运算(|)n n按位“或”运算功能:参加运算的两个运算数中,只要两个相应的二进制位中有一个为1,该位的运算结果即为1;只有当两个相应位的数都为0时,该位的运算结果才为0。例如:n n 0

63、123:01010011n n 014:00001100n n 结果:0101111179第十六章文件n n知识点知识点1 1:文件指针:文件指针n n文件指针,实际上是指向一个结构体类型的指针变量;文件指针,实际上是指向一个结构体类型的指针变量;这个结构体中包含有诸如:缓冲区的地址、在缓冲区中这个结构体中包含有诸如:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是当前存取的字符的位置、对文件是“读读”还是还是“写写”、是否已经遇到文件结束标志等信息。我们不必去了解其是否已经遇到文件结束标志等信息。我们不必去了解其中的细节,所有一切都在中的细节,所有一切都在stdio.hstdio.h头

64、文件中进行了定义;头文件中进行了定义;并称此结构体类型名为并称此结构体类型名为FILE,FILE,可以用此类型名来定义文可以用此类型名来定义文件指针。定义文件类型指针变量的一般形式为:件指针。定义文件类型指针变量的一般形式为:n n FILE *FILE *指针变量名;指针变量名;n n例如:例如: FILE *fp1,*fp2;FILE *fp1,*fp2;n nfp1,fp2fp1,fp2均被定义为指向文件类型的指针变量,称为文均被定义为指向文件类型的指针变量,称为文件指针。件指针。80n n知识点2:打开文件n n1.fopen函数。用于打开文件。n n(1)调用形式如下:n n FIL

65、E *fp;n n fp=fopen(文件名,文件使用方式);n n例如:fp=fopen(“C:abc.dat”,”w”);,打开C盘上的文件abc.dat,并对此文件可进行“写”操作。文件名和使用方式都用字符串表示。n n(2)应当熟悉常用文件使用方式 的表示方式和功能,如下表:81使用方式含义(用于文本文件)使用方式含义(用于二进制文件)“r”(只读)为读而打开文本文件“rb”(只读)为读打开二进制文件“w”(只写)为写而打开文本文件“wb”(只写)为写建立新二进制文件“a”(追加)向文本文件尾添加数据“ab” (追加)向二进制文件尾添加数据“r+”或“rw”(读写)为读/写而打开文本文

66、件“rb+” (读写)为读/写打开二进制文件“w+或“wr” (写读)为写/读建立新文本文件“wb+” (写读)为写/读建立新二进制文件“a+或“ar” (写读)为添加/读打开文本文件“ab+” (写读)为添加/读打开二进制文件82n n知识点4:关闭文件n n当文件的读(写)操作完成这后,必须将它关闭。关闭文件可调用库函数fclose来实现,fclose函数的调用形式如下:n n fclose(文件指针)n n fclose(fp);,其中fp已指向某文件。n nfclose函数作用是使文件指针fp与所指文件脱离联系,并由系统妥善处理该文件缓冲区的重要剩余数据。83n n知识点5:文件输入和

67、输出函数n n当成功地打开文件之后,接下来的事情就是对文件进行输入或输出操作。n n1.调用putc(或fputc)函数输出一个字符n n putc函数的调用形式如下“n n putc(ch,fp);n n ch是待输出的某个字符,可以是一个字符常量,也可以是一个字符变量。fp是文件指针。功能是将字符ch写到文件指针fp所指的文件中去。成功则返回所输出的字符;失败返回一个EOF值。EOF是stdio.h库函数文件中定义的符号常量,其值等于-1.n n fputc函数的调用形式和函数的功能与putc函数完全相同。84n n例:把从键盘输入的文本按原样输出到名为例:把从键盘输入的文本按原样输出到名

68、为file_a.datfile_a.dat文件中,用字符文件中,用字符 作为键盘输入结束标志。作为键盘输入结束标志。n n操作步骤:操作步骤:1.1.打开文件;打开文件;2.2.从键盘输入一个字符。从键盘输入一个字符。3.3.判判输入的字符是否是字符输入的字符是否是字符,若是,结束循环,执行步骤若是,结束循环,执行步骤(7 7)。)。4.4.把刚输入的字符输出到文件中。把刚输入的字符输出到文件中。5.5.从键盘输从键盘输入一个字符。入一个字符。6.6.重复步骤(重复步骤(3 3)和()和(5 5)。)。7.7.关闭文件。关闭文件。8.8.程序结束。程序结束。n n#include “stdio

69、.h”#include “stdio.h”n n main() main()n n FILE *fpout; FILE *fpout;n n char ch; char ch;n n if(fpout=fopen(“fele_a.dat”,”w”)=NULL) if(fpout=fopen(“fele_a.dat”,”w”)=NULL)n n printf(“Cant open this file!n”);exit(0); printf(“Cant open this file!n”);exit(0);n n ch=getchar(); ch=getchar();n n while(ch!=)

70、 while(ch!=)n n fputc(ch,fpout);ch=getchar();fclose(fpout); fputc(ch,fpout);ch=getchar();fclose(fpout);85n n2.调用getc(或fgetc)函数输入一个字符n ngetc函数的调用形式如下:n n ch=getc(pf);n n此处pf是文件指针;函数的功能是从pf指定的文件中读入一个字符,并把它作为函数值返回。以上表达式中getc函数把文件中讲稿的一个字符赋给变量ch。n n fgetc函数的调用形式和函数的功能与getc函数完全相同。n n例:把一个已存在磁盘上的file_a.dat

71、文本文件中的内容,原样输出到终端屏幕上。86n n步骤:步骤:1. 1.打开文件。打开文件。2. 2.从指定文件中讲稿一个字符。从指定文件中讲稿一个字符。3. 3.读读入的是否是文件结束标志;若是,结束循环,执行步骤入的是否是文件结束标志;若是,结束循环,执行步骤(7 7)。)。4. 4.把刚输入的字符输出到终端屏幕。把刚输入的字符输出到终端屏幕。5. 5.从文件中从文件中再读入一个字符。再读入一个字符。6. 6.重复步骤(重复步骤(3 3)和()和(5 5)。)。7. 7.关闭文关闭文件。件。8. 8.程序结束。程序结束。n n#include “stdio.h”#include “stdi

72、o.h”n n main() main()n n FILE *fpin; FILE *fpin;n n char ch; char ch;n n if(fpin=fopen(“file_a.dat”,”r”)=NULL) if(fpin=fopen(“file_a.dat”,”r”)=NULL)n n printf(“Cant open this file!n”);exit(0); printf(“Cant open this file!n”);exit(0);n n ch=fgetc(fpin); ch=fgetc(fpin);n n while(ch!=EOF) putchar(ch);

73、ch=fgetc(fpin); while(ch!=EOF) putchar(ch); ch=fgetc(fpin);n n fclose(fpin); fclose(fpin);87n n知识点6:文件结束的标志n n文本文件可用预定义符EOF作为文件结束标志。当把数据以二进制形式存放到文件中时,就会有-1值出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一问题,提供一个feof函数,判断文件是否结束。如果遇到文件结束,函数feof(fp)的值为1,否则为0.feof函数既可判断二进制文件又可判断文本文件。88n n知识点7:fscanf函数和fprintf函数n n按格式进行输入

74、和输出的函数只能用文本文件。n n1.fscanf函数。函数的调用形式为:n nfscanf(文件指针,格式控制字符串,输入项表)n n例如:fscanf(fp,”%d%d”,&a,&b);,将从fp所指的文件中读入两个整数放入变量a和b中。n n注意:文件中的两个整数之间用间隔符隔开。n n2.fprintf函数。函数的调用形式:n nfprintf(文件指针,格式控制字符串,输出项表)n n例如:fprintf(fp,”%d%d”,a,b);,是把两个整型变量中的整数按%d格式输出到fp所指的文件中。89n n知识点8:fgets函数和fputs函数n n1.fgets函数n nfgets

75、函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);n nfp是文件指针,str是存放字符串的起始地址,n是一个int类型变量。功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作。读入结束后,系统将自动在最后加0,并以str作为函数值返回。90n n2.fputs函数n n fputs函数用来把字符串输出到文件中。Fputs函数的调用形式如下:fputs(str,fp);n n fp是文件指针;str是待输出的字符串。输出时,字符串中最后的0并不输

76、出,也自动加n。输出成功函数值为正整数,否则为-1(EOF)。n n3.注意调用fputs函数输出字符串时,文件中各字符串将首尾相接,它们之间将不存在任何间隔符。为了便于读入,在输出字符串时,应当注意人为地加入诸”n”这样的字符串。91n n知识点9:fread函数和fwrite函数n nfread和fwrite函数用来读、写二进制文件。一个二进制文件由同一类型的数据构成。n n1.调用形式:n n fread(buffer,size,count,fp);n n fwrite(buffer,size,count,fp);n n其中,buffer是数据块的指针,对fread来说,它是存放输入数据

77、块的首地址,对于fwrite来说,它是准备输出的数据块的起始地址。size表示每个数据的字节数。count用来指定每读、写一次,输入或输出数据块的个数。fp是文件指针。92n n2.例如有以下结构体:n n struct stn n char num8;n n float mk5;n n pers30;n n执行以下循环将把30个元素中的数据输出到fp所指文件中。n n for(i=0;i30;i+) n nfwrite(&persi,sizeof(struct st),1,fp);n n每执行一次fwrite函数调用,就从&persi地址开始输出由第3个参数指定的“1”个数据块,每个数据块含

78、sizeof(struc st)个字节二进制数,也就是一次输出一个结构体变量中的值。93n n知识点10:文件定位函数n n文件位置指针:表示当前读或写数据在文件中的位置。当通过fopen函数打开文件时,可以认为文件位置指针总是指向文件的开头、第一个数据之前。当文件位置指针指向文件末尾时,表示文件结束。当进行读操作时,总是从文件位置指针所指位置开始,去读其后的数据,然后位置指针移到尚未读的数据之前,以备指示下一次的读(或写)操作。当进行写操作时,总是从文件位置指针所指位置开始去写,然后移到刚写入的数据之后,以备指示下一次输出的起始位置。94n n1.fseek函数n nfseek函数用来移动文

79、件位置指针到指定的位置上,接着的读或写操作将从此位置开始。函数的调用形式如下:n n fseek(pf,offset,origin)n n此处,pf是文件指针,offset是以字节为单位的位移量,必须是长整型数,origin是起始点,用以指定位移量是以哪个为基准的,起始点既可用标识符来表示,也可用数字来代表。下表给出了代表起始点的标识符和对应的数字。95n n对于二进制文件,当位移量为正整数时,表示位置指针对于二进制文件,当位移量为正整数时,表示位置指针从指定的起始点向文件尾部方向移动;当位移量为负整从指定的起始点向文件尾部方向移动;当位移量为负整数时,表示位置指针从指定的起始点向文件首部方向

80、移数时,表示位置指针从指定的起始点向文件首部方向移动。例如:动。例如:n nfseek(pf,-10L*sizeof(int),SEEK_END);fseek(pf,-10L*sizeof(int),SEEK_END);,使文件位置,使文件位置指针从文件尾部前移指针从文件尾部前移10sizeof(int),10sizeof(int),即即2020个字节。个字节。n n对于文本文件,位移量必需是对于文本文件,位移量必需是0.0.例如若例如若pfpf指向一个文本指向一个文本文件,文件,fseek(pf,0L,SEEK_SET),fseek(pf,0L,SEEK_SET),使文件位置指针移到文使文件

81、位置指针移到文件的开始。件的开始。fseek(pf,0L,SEEK_END),fseek(pf,0L,SEEK_END),使文件位置指针移使文件位置指针移到文件的末尾。到文件的末尾。标识符数字代表的起始点SEEK_SET0文件开始SEEK_END2文件末尾SEEK_CUR1文件当前位置96n n2.ftell函数n nftell函数用以获得的文件当前位置指针的位置,函数给出当前位置指针相对于文件开头的字节数。若fp已指向一正确打开的文件,函数调用形式如下:n n long t; t=ftell(fp);n n当函数调用出错时,函数返回-1L。n n3.rewind函数n nrewind函数又称“反绕”函数,调用形式如下:n n rewind(pf);n n此处pf为文件指针。此函数没有返回值。函数的功能是使文件的位置指针回到文件的开头。97

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号