c语言:这两个语句什么意思 fseek fp 0 2(fp,0L,0); fprintf(fp,"%d\n",a

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!ch[5]-->?z?,printf函数要求以%c形式输出,故输出字符Z。  例12.(09-09-37)设有定义:char *c;.以下选项中能够使字符型指针c正确指向一个字符串的是(A)A)char str[]=”string“; c= & B)scanf(”%s“,c); C)c=get);D)*c=”string“;  【解析】选项A为正确用法。先将字符串存于字符数组中,然后将数组名赋给字符指针。选项B为无语法错误,但运行时可能会出现问题。原因是字符指针没有被赋值,是一个不确定的值,指向一个不确定的内存区域,这个区域可能存放有用的指令或数据。在这个不确定的区域重新存放输入的字符串,可能会发生无法预知的错误。选项C错误。get)函数输入一个字符给字符型变量,而不应该是字符指针。选项D错误。*c=”string“应该改为c=”string“才是正确的。  第 34 页 & &共 61 页  聪智学校  第五课 函数 第 35 页 & & & 共 61 页  聪智学校  第 36 页 & & & 共 61 页  聪智学校  本课重要知识点:  1、知识点:函数的概述  ? 在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。  ? ?  C源程序是由函数组成的,函数由函数首部与函数体组成,函数体包括声明例1、下列叙述中正确的是( &D &)A)每个C程序文件中都必须要有一个main()函数部分和执行语句部分组成。  B)在C程序中main ()函数的位置是固定的  C语言程序可以由多个源程序组成,其中一个源程序文件包含main函数,其C)C程序中所有函数之间都可以是固定的  他函数可以写在另外的源程序文件中,为单独文件,并且可以单独编译。 &D)在C程序的函数中不能定义另一个函数 例1:(10-03-11)以下叙述正确的是( &B )【解析】一个C源程序可以由多个C程序文件,但只能有一个main()函数,并不A)C语言程序是由过程和函数组成的  是每个C程序文件都必须要有一个main(),main()函数可以放在任意位置,且不允B)C语言函数可以嵌套调用,例如:fun(fun(x))许被其他函数调用,因此正确答案是D。  C)C语言函数不可以单独编译  D)C语言中除了main函数,其他函数不可以作为单独文件形式存在2、知识点:函数的定义  (C) 【解析】选项A错误,C语言中没有过程的概念;选项B正确,C语言可以嵌套例1:以下正确的函数定义形式是:调用(此知识点在后面介绍);选项C错误,C语言中可以对包含一个或多个函数的源程序单独编译;选项D错误,C语言函数可以单独存在。  A)double &fun(int x,int y);{}  B) double &fun(int y){} D) &double &fun(int x, y);{}  C) double &fun(int x,int y){}  ?  C程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main【解析】在函数中对形参的说明,要求对每个形参都必须说明类型,各参数之间用”,“隔开,函数定义后应无”;“。  函数,最后由main函数结束整个程序。main 函数可以调用其它函数,而不? 函数返回return语句的一般形式:return 表达式;或return &(表达式); 允许被其它函数调用。一个C源程序必须有,也只能有一个主函数main。  在函数中允许有多个return语句,但每次只能有一个return语句被执行。 例1:下列叙述中正确的是( &C &)A)C语言程序将从源程序中第一个函数开始执行B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以命名任意一个函数作为主函数。  例1:(10-03-24)以下关于return语句叙述中正确的是( B)A)一个自定义函数中必须有一条return语句  B)一个自定义函数中可以根据不同情况设置多条return语句 C)定义void类型的函数中可以有带返回值的return语句第 37 页 & & & 共 61 页  聪智学校  D)没有return语句的自定义函数在执行结束时不能返回到调用处。 &例1、(09-09-24)有以下程序 #includevoid fun(int p) {int d=2;  p=d++; printf(”%d“,p); }  【解析】自定义函数中可以没有return语句(如不需要返回值的函数,常见void 类型)),可以有多条return语句(如在分支结构中,可以从不同分支中返回到调用 程序,常见ifelse);定义成void类型的函数,不允许从该函数取得返回值,也不 允许使用return语句。没有return语句的函数在执行到函数的最后一条语句后自动 返回达到调用处。  ? 函数值的类型与函数定义中函数的类型保持一致,如不一致,以函数类型为准。  例2:(06-04-23)已定义以下函数  int fun(int *p){return *p;} &fun函数返回值是( B ) &A)不确定的值 & B)一个整数 &C)形参P中存放的值 D)形参P的地址值 & &【解析】函数返回性类型取决于定义函数时函数名称前的类型,fun前是int,表明函数fun执行完毕后返回一个整型数。正确答案:B? return 后的表达式可以是常量、变量、表达式,也可以空。  如: & return 0; & & & return (a+b);main() { &}  int a=1;  fun(a); printf(”%d\n“,a);  程序运行后的输出结果是( C )  B)12  C)21  D)22  A) 32  【解析】此题考点为函数参数的传递。C语言中函数参数的传递是值传递,是把实参的值传给形参,是单向传递,形参的改变不会影响到实参的值。程序中,把实参a的值传给形参p,p=1,然后p=d++,再次赋值后p=2,输出p的值2。返回到主程序中,输出a的值为1。(形参p的改变不会影响到实参a的值,a的值仍为1)。  3、知识点:形参和实参及函数调用 ? ?  在主调函数中(调用函数时函数名后面括号中的参数)因此答案为C.  形参出现在函数定义中(即定义函数时函数名后面括号中的参数),实参出现? 在传递数值时,形参和实在分别占据不同的存储单元(形参变量只有在被调用时才分配内存单元,调用结束后,即刻释放分配的内存单元)例1、(07-04-25)若函数调用时的实参为变量时,以下关于函数形参和实参的形参在本函数体内都可以使用,离开该函数则不能使用。实参在主调函数中 函数必须有确定的值)内有效,进入被调函数后,实参变量也不能使用。(注:在进行函数调用时,叙述中正确的是( D)A)函数的实参和其对应的形参共占同一存储单元? 实参向形参单向传递数值,不能将形参的值反向的传送给实参。实参和形参 & &B)形参只是形式上的存在,不占用具体存储单元在数据上、类型上、顺序上要一致。在函数调用过程中,形参的变化不会改变实参的变化。  C)同名的实参和形参占同一存储单元 & D)函数的形参和实参分别占用不同的存储单元第 38 页 & & & 共 61 页  聪智学校  【解析】本题考点是函数的参数定义,在函数中,主调数中里边的参数叫做实 (1)函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参,而被调函数里边的参数叫做形参,当函数传递时,传递的是值,它们占用的不参与表达式运算。例如:z=max(x,y); 是同一存储单元,而且在传递中,是单向传的,由实参传向形参。  (2)函数语句:函数调用的一般形式上加上分号。例如:printf(”%d\n“,a); (3)函数实参:函数作为另一个函数调用的实际参数出现。例如:  ? &”传值“与”传址“的区别:传数值的话,形参的变化不会改变实参的变化。  传地址的话,形参的变化就有可能改变实参所对应的量。  例1:(10-03-26)有以下程序 #includevoid fun(char *c,int d) { &} main(){ char b=?a?, a=?A?; & fun(&b,a);  printf((”%c,%c\n“,b,a); }  程序运行后的输出结果是( A)  B)b,B,B,A  C)a,B,B,a  D)a,B,a,B  *c=*c+1; & d=d+1; printf(”%c,%c“,*c,d);printf(”%d“,max(x,y));  ? 程序从main函数进入,上往下执行,当碰到函数名后,把值传给调用函数,当程序得到了返回值或调用函数结束,再顺序往下执行,最后到main函数结束。  5、知识点:函数的声明及其位置  ? 函数要”先定义后调用“,或”先声明再调用后定义“。函数的声明一定要有函数名、函数返回值类型、函数参数类型,但不一定要有形参的名称。 一般形式为:  类型说明符 被调函数名(类型 形参,类型 形参…); &或 & &类型说明符 被调函数名(类型,类型…); 注意:其末尾”;“不能省例如:int max(int a,int b); & &或 & int max(int ,int); &两者功能相同 例1、(06-09-32)若有以下函数首部int fun(double x[10],int *n)  则下面针对此函数声母语句中正确的是(D)  A) b,B,b,A  4、知识点:函数调用的一般形式和调用方式  ? 函数调用的一般形式为:函数名(实际参数表);A)int fun(double x,int *n); &B)int fun(double,int); 实参可以是常数、变量或其他构造类型数据及表达式,也可以没有(当为无参C)int fun(double*x,int n); &D)int fun(double *,int。);函数时)  【解析】本题考点是对函数的声明,在函数声明的时候,其格式如下:返回值类型? 函数调用的方式:  第 39 页 & & & 共 61 页  聪智学校  函数名(参数类型[参数名],参数类型[参数名]??)其中,参数名可以不写,但是参main(){ &double x,y,(*p)(); 数类型一定要写全 scanf(”%lf%lf“,&x,&y);? 省去主调函数中对被调函数的函数说明的几种情况: p=printf(”%f\n“,(*p)(x,y)); (1)被调函数的返回值是整型或字符型时(返回值自动按整型处理)} (2)当被调函数的函数定义在主调函数之前时 double avg(double a,double b) (3)在所有函数定义之前,在函数外预先说明了各个函数的类型 { return((a+b)/2);}  例2:(10-09-24)有以下程序 答案:double avg(double a,double b); 或double avg(double ,double );【解析】当函数定义在调用之后,调用前必须对函数进行申明,申明的形式和函数 #include定义中的函数头部分相同,最后加分号即可。 & int f(int x);main() { int n=1,m; &m=f(f(f(n))); &printf(”%d\n“,m); } int f(int x) { return x*2;} 程序运行的输出结果( &D &) A) 1 &B)2 & C)4 & D)8 6、知识点:函数的嵌套调用 ? C语言中不允许作嵌套的函数定义,但是允许在一个函数的断定仪中出现对另一个函数的调用,即嵌套调用。 例1:(06-04-33)有以下程序 & & int funl(double a){return &a*=a;} & & int fun2(double x,double y) & &{double a=0,b=0; & & a=funl(x);b=funl(y);return (int)(a+b);【解析】f函数定义在main下面,但在外部进行声明int f(int x);因此在main中可} 直接调用。 main() 三次调用函数:f(n)=f(1)=2 &f(2)=4 &f(4)=8 m=f(f(f(n)))=f(f(f(1)))=f(f(2))=f(4)=8 & &{double &w;w=fun2(1.1,2.0);??} 例3:(11-03-12)有以下程序,请在 【12】 处填写正确语句,使程序可正常编译 & 程序执行后变量w中的值是( C ) 运行。  A)5.2l & &B)5 & &C)5.0 &D)0.0 【12】;第 40 页 & & & 共 61 页  聪智学校  【解析】此题考查函数的嵌套调用。main函数中调用了fun2函数;fun2函数中又例1、(04-09-37)在函数调用过程中,如果函数funA调用了函数funB,函数调用了如fun1函数w=fun2(1.1,2.0)-->w=(int)(funl(1.1)+funl(2.0))?w=(int)5.21;wfunB又调用了函数funA,则 ( B ) 值为5,但是w是double类型变量,故将5转换成5.0赋值给变量w 例2、(09-3-24)有以下程序 #includeint f(int x,int y) {return ((y-x)*x);} main() {int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); &}  printf(”%d\n“,d);  程序运行后的输出结果是( &B )  C)8  D)7  A)称为函数的直接递归调用 & & B)称为函数的间接递归调用 & & C)称为函数的循环调用D)C语言中不允许这样的递归调用  【解析】此题考查函数递归的基本概念。一个函数直接或间接调用自己称为函数的递归调用;若直接调用了自己,则称为直接递归调用,若间接调用了自己则称为间接递归调用;根据间接递归调用的概念可知,本题中的函数调用为间接递归调用。 例2、(09-09-15) #includefun(int x) {if(x/2>0) fun(x/2); printf(”%d &“,x);A) 10 & &B)9  【解析】程序的main()函数中,定义了4个变量,前3个分别初始化,D用来接收 调用函数后返回的值,主函数一共调用了3次f()函数,第一次传递a,b的值,给形}  参x,y,返回(y-x)*x的值为3,第二次将a,c的值传递给形参x,y,返回(y-x)main()*x的值为6,接着将f(a,b),f(a,c)的值3、6传递给形参,执行后返回值9,赋值变{ & fun(6); & printf(”\n“);}程序运行后的输出结果是量d,最后输出结果为9【解析】程序的执行过程是先递推、后递归的过程。当x=1时,条件不成立,递推终止。程序执行流程参照示意图。  7、知识点:函数的递归调用  ? 函数直接或间接地调用自己称为函数的递归调用。递归调用必须有一个明确的结束递归的条件。在做递归题时可把递归的步骤一步步写下来,不要弄颠倒了。  第 41 页 & & & 共 61 页  聪智学校  例3:(10-03-33)有以下程序 #includeint f(int t[],int n); main(){ int a[4]={1,2,3,4},s;  s=f(a,4); printf(”%d\n“,s); }  int f(int t[],int n)  { if(n>0) return t=[n-1]+f(t,n-1); &else return 0;}程序运行后的输出结果是( B)  A) 4 &B) 10 &C)14 & &D)6  【解析】 s=f(a,4)=t[3]+f(a,3)=4+f(a,3)=4+t[2]+f(a,2)=4+3+f(a,2)=7+t[1]+f(a,1) =7+2+f(a,1)=9+t[0]+f(a,0)=9+1+f(a,0)=10+0=10 例4:(11-03-32)设有如下函数定义 &int fun(int k)第 42 页 { &if (k<1) return 0;  else if(k==1) return 1; else return fun(k-1)+1;}若执行调用语句:n=fun(3);,则函数fun总共被调用的次数是( B)A)2 & & & & & & & &B)3 & & & & & & C)4 & & & & & & & D)5【解析】递归调用,fun(3)> fun(2)> fun(1) ;fun(1)1> fun(2)2> fun(3)3>n;所以fun总共被调用的次数是3,最后n为3。 例5:(11-03-34)有以下程序 &int fun (int x,int y){ &if (x!=y) return ((x+y)/2); else return (x); }  main()  { &int a=4,b=5,c=6;  printf(”%d\n“,fun(2*a,fun(b,c))); }程序运行后的输出结果是( B)A)3 & & & & & & &B)6 & & & & & & &C)8 & & & & & & & &D)12 【解析】函数递归调用,fun(8,fun(5,6)),其中fun(5,6)因为5!=6, return ((x+y)/2)为5,所以fun(8,fun(5,6))为fun(8,5),8!=5, return ((x+y)/2)为68、知识点:局部变量和全局变量  ? 在一个函数内部或复合语句内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在函数以外是不能使用这些变量的。这称为局部变量,局部变量又称为内部变量。函数的形参也属于局部变量。 ? 在函数外部定义的变量,称为全局变量,又称为外部变量。全局变量可以被例1、(07-09-40)在一个C语言源程序文件中所定义的全局变量,其作用域为(D)共 61 页  聪智学校  A)所在文件的全部范围 & &B)所在程序的全部范围C)所在函数的全部范围 & &D)由具体定义位置和extem说明来决定范围注意格式控制符无空格,所以连续输出  9知识点:变量存储类别(auto变量、register变量、static变量)? 静态变量(static):  (1)在编译时分配存储空间,所占存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在,且变量的初始化只进行一次。  (2)static说明符可以用于全局变量,也可用于局部变量(auto和resgiter不可以定义全局变量)但是,当它说明变量后,只要这个变量还在程序中存在,那么不管用到还是没有用到,它都将会占用内存单元。 例1:(10-09-36)有以下程序: #includeint f() { &} main() { & int i,s=1; & }  for(i=1;i<=5;i++) s+=fun(); printf(”%d\n“,s);程序运行后的输出结果是( B) A)11 &B)21 C)6D)120  static int x=1; x+=1;    【解析】本题考点是全局变量的作用域,全局变量的作用域是,从变量定义开始,一直到程序程结束为止,当然,也可以在其它文件中用这个以定义的全局变是,但是要通过extern来进行声明,本题答案选D。 例2、(09-09-11)有以下程序 #includeint a=5; void fun(int b) { &} main() {int c=20; fun(c); a+=c; printf(”%d\n“,a); int a=10; a+=b; printf(”%d“,a)}程序运行后的输出结果是____3025____  【解析】全局变量的作用域为定义开始到文件结束。局部变量的作用域为定义其函数内部。当局部变量与全部变量同名时,在局部变量作用域内,全部变量不起作用。 执行函数fun(c): 实参c 将值传给形参b,即b=20,函数内部定义局部变量a起作用,a=10,a+=ba=a+b=10+20=30,输出a的值为30  a=a+c=5+20=25 输出a值25  返回到主函数: a+=c 此时a为全局变量的值  【解析】fun函数被调用了5次,每次调用后的值返回值累加到s上。  第一次:静态局部变量定义有效,x=2,返回值为2。s=s+fun()=1+2=3;从第2次调用第 43 页 & & & 共 61 页  聪智学校  开始,静态局部变量的定义相当于不存在,直接使用x的值。 第二次:x=3 &s=3+3=6第三次:x=4 &s=6+4=10  A)auto和register & B)extern和register &C)auto和static &D)static和register 【解析】auto变量在进入函数体时,系统为其分配存储单元,退出时自动释放; register是建议编译程序将变量的值保存在cpu的寄存器中,而不是占用内存单元;extern可以对全局变量加以说明,扩展其作用域,在整个程序中都有效,所以会一直占用内存单元;static说明符可以用于全局变量,也可用于局部变量,使变量在整个程序执行期间一直占用内存单元,本题答案选A。  例2:(10-09-34)设函数中有整形变量n,为保证其在未赋初值的情况下初值为0,应该选择的存储类别是( C )A)auto  B)register  C)static  D)auto 或register  第四次:x=5 &s=10+5=15 &第五次:x=6 &s=15+6=21例2:(11-03-34)有以下程序 int fun()  { &static int x=1;  x*=2; }  main()  { int i,s=1;  for(i=1;i<=3;i++) s*=fun(); printf(”%d\n“,s);}程序运行后的输出结果是(D)  A)0 & & & & & B)10 & & & & & C)30 & & & & & D)64【解析】静态变量static类型,在函数执行完后空间并不释放,而且只初始化一次。所以第一次调用后,x的值为2,返回后s的值为2,第二次调用后,x的值为2*2=4,返回后s的值为2*4=8,第三次调用后,x的值为4*2=8,返回后s的值为8*8=64,故选D。  ? 自动变量(auto)  (1)自动变量的存储空间是当程序执行到定义它的函数或语句块时才分配,当函数执行结束后自动释放,变量的值也就不再存在。  (2)局部变量的存储类别默认为auto,可以省略不写,但它不能定义全局变量。 ? 寄存器变量(register):  例1、(08-04-39)在C语言中,只有在使用时才占用内存单元的变量,其存储类型是( A )。  【解析】对于静态局部变量(static),如在定义时不赋初值的话,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对于自动变量(auto或者缺省不写),如果不赋初值则它的值是一个不正确的值。  10、内部函数与外部函数  ? 用static 进行说明的函数称为静态函数,也叫内部函数。静态函数只能被本编译单元体内的函数调用。一般形式:static 类型标识符 函数名(形参表) 例如:static int fun(){…}  11、知识点:库函数  ? 函数可以分为库函数和用户自定义函数。库函数由C系统提供,用户无须定义,在调用C语言标准库函数时要包含include命令,include命令行以#开头;xx  例1、(07-04-17)若有代数式n?e| (其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是( C)第 44 页 & & & 共 61 页  聪智学校  A)sqrt(abs(nx+ex)) & & & & & & & &B) sqrt(fbs(pow(n,x)+pow(x,e)))C)sqrt(fabs(pow(n,x)+exp(x,e))) & & D)sqrt(fabs(pow(x,n)+exp(x))) 例1:()以下程序的主函数中调用了在其前面定义的fun函数 #include【解析】exp()函数的功能是返回以自然数e为底、函数参数x为幂的指数值main()ex &;pow(n,x)函数是计算nx ;fabs()函数的功能是返回函数参数的绝对值;sqrt()用{double a[15],k;于返回函数参数的平方根。所以正确答案为C。  例2:以下说法不正确的是(B)  A)标准库函数按分类在不同的头文件中声明  B)用户可以重新定义标准库函数  C)系统不允许用户重新定义标准库函数 k=fun(a); }则以下选项中错误的fun函数首部是 &( D) &A.double &fun(double &a[15]) & &C.double &fun(double &a[]) & & & B.double &fun(double &*a) D.double &fun(double &a) 【解析】当一维数组名a作为实参时,对应形参有三种表示形式:*a、a[ ]、a[N]( 注:  D)用户若需要调用标准库函数,调用前必须使用预编译命令将该函数所在文件包N为定义a数组时的元素个数)例1:(11-03-11)己知a所指的数组中有N个元素。函数fun的功能是,将下标括到用户源文件中k(k>0)开始的后续元素全部向前移动一个位置。请填空。 【解析】对每一类库函数,都有相应的头文件名,调用某个库函数时,用户在源Void fun(int a[N],int k)程序中须用include命令包含其头文件名。每一类标准库函数是C语言本身提供的,{ &for(i=k;i<N;i++) a[【11】]=a[i]; 用户不能重新定义标准库函数。  } 12、知识点:数组与函数 答案:i-1  【解析】a[i]的值赋给a[i-1] ? 数组用作函数参数有两种形式:把数组元素(下标变量)作为实参使用和把例2:(10-09-32)有以下程序 数组名作为函数的形参和实参使用。  #include? 数组元素作函数的实参与普通变量并无区别,所进行的传递是值,形参变量#define N 8 和实参变量占据由编译系统分配的两个不同的内存单元;void fun(int *x,int i) ? 数组名作为函数参数时,所进行的传递是地址(相当于把实参数组的首地址{ & *x=*(x+i); } 赋予形参数组名或指针名),形参数组与实参数组为同一数组,共同拥有一段main() 内存单元;  第 45 页 & & & 共 61 页  聪智学校  {  int a[N]={1,2,3,4,5,6,7,8},i; fun(a,2); for(i=0;i<N/2;i++) { printf(”%d“,a[i]);} printf(”\n“);【解析】调用fun(a)函数,实参字符数组名a传递给形参字符指针s,使s指向字符串”good“;在函数fun中对字符串进行遍历,如果指针s指向字符ASCII码值是偶数则输出该字符。在字符串”good“中,只有”d“的ASCII码值为偶数13指针与函数  ? 函数指针变量是指向函数的指针变量。  C) 3 &2 &3 &4  D) 1 &2 &3 &4  定义的一般形式为: &类型说明符 (*指针变量名)(); & & &例如: int (*pf)(); 调用函数的一般形式:(*指针变量名)(实参表) 例如:z=(*p)(x,y);?注: (*指针变量名)中的”()“不能少  }程序运行后的输出结果是( &C ) A) 1 &3 &1 &3B)2 &2 &3 &4  【解析】数组名代表数组首地址,即a[0]的地址。函数调用:fun(a,2) 参数传递后,形参指针x获得数组首地址,即指向a[0],形参变量i=2;*x即为a[0],*(x+2)即a[2],*x=*(x+2)相当于a[0]=a[2],a[0]变为3,a[2]不变。返回到主程序:循环4次,输出a数组前4个元素: &3 2 3 4 例3:(10-09-25)有以下程序 #includevoid fun(char *s) { &while (*s) & } main() {char a[]={”good“}; fun(a);printf(”\n“);{if (*s%2==0) printf(”%c“,*s); &s++;}  例1:(09-09-33)设有以下函数:  void fun(int n,char *s){…} 则下面对函数指针的定义和赋值均正确的是( A ) A)void (*pf)(); pf= & & & & & & B)void *pf(); pf= C)void *pf(); *pf= & & & & & & D)void (*pf)(int,char);pf=&【解析】本题考点为指向函数的指针的用法。函数名代表函数的入口地址,可以赋值给指向函数的指针。指向函数的指针应该定义为void (*pf)()。如定义为void *pf(),则表示函数pf返回值为一个基类型为 void的指针。 ? 函数指针变量不能进行算术运算。  ? 指针型函数是指返回指针值的函数。定义的一般形式为:  类型说明符 *函数名例1:(10-09-11)有以下程序 #includeint *f(int *p,int *q) & &main()}注意:字母a的ASCII码值为97,程序运行后的输出结果是( &A &)A) d  B)go  C)god  D)good  第 46 页 & & & 共 61 页  聪智学校  { &int m=1,n=2,*r=&m;  r=f(r,&n) ; printf(”%d\n“,*r) ;  } { &} if(*c>=?a?&&*c<=?z?) *c=*c-(?a?-?A?); c++; }  main() int *f(int *p,int *q)  { &char s[81]; { return (*p>*q) ?p :} gets(s); fun(s); puts(s): 程序运行后的输出结果是______2_____ }当执行程序时从键盘上输入Hello Beijing,则程序的输出结果是( C )【解析】本题中f是个指针型函数,返回值为指针值。如示意图。主程序中,指针A)hello beijing & &B)Hello Beijing & &C)HELLO BEIJING & &D)hELLO Beijing r指向m,函数调用f(r,&n)时,实参传递给形参,形参指针p指向m,指针q指向【解析】gets(s)将输入的Hello Beijing赋给了字符数组s,调用fun(s),将字符数组s的首地址传给了c,c指向的即为字符数组的首地址,通过指针变量c取得字符数n,*p的值为m的值1,*q的值为n的值2,所以函数返回值为q,返回给主程序组中的字符判断是不是小写字母,如果是变成大写字母。*c=*c-(?a?-?A?)完成小写中的指针r,即指针r指向了n,最后输出*r的值为n的值2. 换大写的功能。故选C。另外注意gets(s)和scanf(”%s“,s);的区别:scanf以空格作例2:(11-03-29)有以下程序 &为字符串输入结束的标志,而gets(s)不需要 void fun(char *c) &{ &while(*c)第五课 结构体、链表与共用体  第 47 页 & & & 共 61 页  聪智学校  第 48 页 & & & 共 61 页  聪智学校  本课重要知识点:  1.知识点:用typedef定义类型  ? 功能:为已有数据类型取别名  ? 类型定义形式: typedef &旧类型名 &新类型名;(例如:typedef &double D ; ) 注意:  (1) 定义的新名只是原名的一个别名,并不是建立一个新的数据类型; (2) 用新名和原名定义的对象具有相同的性质和效果。 & 例1:()若有以下语句 & typedef &struct &S & {}T;以下叙述中正确的是 ( &B &) & A)可用S定义结构体变量 & B)可用T定义结构体变量 & C)S是struct类型的变量D)T是struct S类型的变量  【解析】此题中用typedef 说明的新类型名T,与中间部分的结构体类型具有相同的性质和效果3. 知识点:结构体变量的定义  第 49 页 & &共 61 页  聪智学校  struct &student &*p,stu1; p=&stu1;  例1:(:)下面结构体的定义语句中,错误的是 ( &B &)A)struct ord {}; & &B)struct ord {} & &C)struct ord {} &D)struct {}【解析】遵循先定义类型,再定义该类型变量的原则,类型定义末尾的分号”;“必不可少2.知识点: 结构体变量各成员的引用  ? 引用结构体变量的成员的方法是:结构体变量名。成员名 &(例如:stu1.sex) ? 结构体指针变量引用成员的方法是: 形式1:(*指针变量名)。成员名 &(例如:(*p)。num) 形式2: 指针变量名->成员名 &(例如:p->num)例1:()设有定义 &? 运算符级别,注意:()和->和 . 同级别,均大于*struct person &设有:  { int ID;char name[12];} &struct student请将scanf(”%d“, & & );语句补充完整,使其能够为结构体变量p的成员ID正确{ char &num;读入数据。 char &name[20];  【解析】此题答案是 &&p.ID &,即在成员ID前缀 p. 表示其从属于变量p,操作 &struct date {int year,mon,day} birth;方式与普通变量和数组没什么不同,只需要在引用时前面标明属于哪个结构体变float score[4];量。 };  第 50 页 & & & 共 61 页  聪智学校  例2:()有以下定义和语句 struct &workers { &int & &char name[20]; srruct{int &int &} &s; };  struct workers &w,* pw=&w  能给w中year成员赋1980的语句是 ( &D &) A)*pw.year=1980; & B)w.year=1980; C)pw->year=1980; & D)w.s.year=1980;【解析】引用w的内嵌结构体变量s的成员year,应逐级递进。具体方法参考前面表格。 例3:()设有定义:struct {char mark[12];int num1;double num2;} t1,t2;,若变量均已正确赋初值,则以下语句中错误的是(C)A)t1=t2; & & &B)t2.num1=t1.num1; & &C)t2.mark=t1. & &D)t2.num2=t1.num2; 【解析】结构体以及结构体成员的赋值,需要类型一致,所有选项都满足,但是mark是结构体中的字符数组的数组名,其数组的首地址,是一个指针常量,只能在初始化的时候赋值,故C错误。 例4:()有以下程序 struct ord{ int x,y;}dt[2]={1,2,3,4}; main() {  struct ord *p=  printf(”%d,“,++(p->x)); printf(”%d\n“,++(p->y)); }程序运行后的输出结果是(D)A)1,2 & & & & & & B)4,1 & & & & C)3,4 & & & & &D)2,3【解析】dt是一个结构体类型的数组,其有两个结构体元素,p是结构体类型指针,其指向dt即指向结构体数组的首地址,p->x和p->y分别是结构体数组第一个元素的x成员和y成员的值,++在前则是先自增1再参与运算,所以输出的是1+1=2,和2+1=3,故选D。  例5:()有以下程序 struct S  { int a,b;}data[2]={10,100,20,200}; main(){ &struct S p=data[1];  printf(”%d\n“,++(p.a));  }程序运行后的输出结果是(D)  A)10 & & & & & & B)11 & & & & & C)20 & & & & & &D)21【解析】结构体变量p赋值为结构体数组第二个元素的值,即p.a=20,p.b=200;所以输出++(p.a)为21,故选D。  3.知识点: 结构体变量与函数调用  ? 将一个结构体变量的值传递给另一个函数,有3个方法:  (1)用结构体变量的成员作参数。例如,用stu[1].num作实参,将值传递给形参。用法和用普通变量作实参是一样的,属于”单向值传递“方式。应当注意实参与形参的类型应保持一致。  (2)用结构体变量作实参。 对应形参也是同类型结构体变量,也属于”单向值传递“方式。  (3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组元素)的地址传给形参。属于”地址传递“方式,应注意在被调用函数中是否对该地址的值有影响。  例1:()有以下程序运行后的输出结果是 & 16 & &typedef struct{} REC; &void fun1(REC x)第 51 页 & & & 共 61 页  聪智学校  { x.num=23;x.s=88.5; } &main()  { REC a={16,90.0}; & &fun1(a);  printf(”%d\n“,a.num); &}  【解析】main函数中的fun1(a); 是将a的值单向传递给了形参x,相当于赋值给了x,因此x的值的变化不会影响到a 例2:()有以下程序 struct A{char b[10];}; &struct A f(struct A t); &main(){ struct A a={1001,”ZhangDa“,1098.0}; & &a=f(a); printf(”%d,%s,%6.1f\n“,a.a,a.b,a.c); &}  struct A f(struct A t)  { t.a=1002;strcpy(t.b,”ChangRong“);t.c=1202.0;} &程序运行后的输出结果是 ( & D & ) A)1001,ZhangDa,1098.0 &B)1002,ZhangDa,1202.0 &C)1001,ChangRong,1098.0 &D)1002,ChangRong,1202.0【解析】注意在f函数中的t.a=1002;strcpy(t.b,”ChangRong“);t.c=1202.0; 这三条语句。  例如: struct &link {  Struct &link *p; &}a;  在此,p是一个可以指向struct link类型变量的指针成员,因此,a.p=&a是合法的表达式,由此构成的存储结构如图所示。 ? 对链表进行的操作通常有以下四种:  1.建立带有头结点的单向链表  2.顺序访问单向链表各结点数据域的值(即遍历链表) struct std { &/*数据域*/  struct std * &/*指针域*/ };  ?建立头结点和数个节点,即建立以下链表 遍历链表: p= while(p!=0) { & printf(”%4d“,p->data); & p=p-> } }  3.删除单向链表中的某个结点  p & & & & &q & & & & & &r  4.知识点:链表  ? 当一个结构体中有一个或多个成员的基类型就是本结构体类型时,通常把这种结构体称为可以”引用自身的结构体“,也称为”链表结构“第 52 页  聪智学校  删除q指向的节点:  p->next=q->或者p->next=r; free(p);4.向单向链表中插入结点  p & & & & &q  将r指向的节点插入p、q所指的两个结点之间: r->next=q; &或者r->next=p-> p->next=r;例1:()在以下程序 &#includemain(){struct node{ struct node *}*p;struct node x[3]={{2,x+1},{4,x+2},{6,NULL}}; p=x;printf(”%d,“,p->n);  printf(”%d\n“,p->next->n);  }程序运行后的输出结果是 &(B) A.2,3 & &B.2,4 & &C.3,4 & &D.4,6第 53 页【解析】通过赋值语句p=x,即p=&x[0],使p指向了x[0],因此p->n等价于x[0].n,输出2;p->next等价于x[0].next,即x+1或表示为&x[1],p->next->n也可表示为x[1].n,输出4例1:()以下程序把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据域中的数据,请填空 #includestruct node{ struct node *};  typedef &struct &node &NODETYPE; main( ){NODETYPE a,b,c,*h,*p;  a.data=10;b.data=20;c.data=30;h=&a; b.next=&b;b.next=&c;c.next=?\0?; p=h;while(p){printf(”%d“,p->data);} }  【解析】while就是用来遍历链表的,为了能遍历每个结点,每执行一次循环,就要使变量p指向下一个结点,所以空白处应填p=p->next5.知识点:共用体类型定义  ? 共用体是一种构造数据类型(遵循先定义类型,再定义该类型变量的原则) ? 用途:使几个不同类型的变量共占一段内存(相互覆盖) ? 与结构体结构体与共用体 1.区别: 存储方式不同,结构体变量占用的内存单元,是其所有成员占内存单元的总和,而共用体变量是其所有成员中占用空间最大的成员的内存单元2.联系: 类型定义、变量定义、成员引用等操作方式相同,两种类型可相互嵌套 例1.(06-0441)有以下程序 main()共 61 页  聪智学校  {union  {char ch [2];    }s;  s.d=0x4321;  printf(”%x,%x\n“,s.ch[0],s.ch[1]);} 在16位编译系统上,程序执行后的输出结果是___ A __A)21,43 & &B)43,21 & &C)43,00 & &D)21,00【解析】此题考查整形数据在内存中存放形式以及共用体内存分配。对于共用体而言,字符数组ch与整型变量d共用2个字节的存储空问;低地址存放低字节,高地址存放高字节;于是0x4321中2l存放在低字节中,43存放在高字节中,故输出时s.ch[0]输出21,s.ch[1]输出43。  第六课 编译预处理、文件  第 54 页 & & & 共 61 页  聪智学校  本课重要知识点: 1.知识点:main()函数的参数第 55 页 & & & 共 61 页  聪智学校  void fun(int x[N]) { int i=0;  {?  while(i<N) scanf(”%d“,_________);} }在程序中下划线处应填入的是  ? int argc是命令行中的字符串数,char *argv[]是指向字符串的指针数组,系统A)x+i & & & &B)&x[i+1] & & & & &C)x+(i++) & & & & D)&x[++i]  答案:C  使用空格把各个字符串隔开。  【解析】要求给每个元素赋值,while循环的变量i必须不断增加,所以A、B显2.知识点:不带参数的宏定义 然不行,i++是先参与运算在自增1,++i是先自增1再参与运算,所以D会出现? 一般形式:#define 宏名 字符串(或数值) x[0]未赋值的情况,故选C。  ? 对程序中用”“括起来的字符串内的字符,即使与宏名相同,也不进行置换。 即用字符串或数值取代宏名。  ? 定义形式:main(int argc,char *argv[])? 宏名一般采用大写字母表示,以与变量名区别,也可用小写字母。 ? 宏定义不是C语句,不必在行末加分号。 例1:()有以下程序 #include#define PT 3.5; #define S(x) PT*x*x; main(){int a=l,b=2;printf(”%4.1f\n“,S(a+b));} 程序运行后输出的结果是(D)A)14.0 & & & & &B)31.5 & & & & C)7.5 & & & &D)程序有错无输出结果? 宏定义可以嵌套使用,例如:  #define R 3.0 #define PI 3.14159 #define L L*PI*R3.知识点:带参数的宏定义  ? 一般形式:#define 宏名(参数表) 字符串? 带参数的宏不占运行时间,只占编译时间;只是简单、机械字符替换;宏名无类型。  ? 要注意有括号和没括号的区别 例1:()有以下程序【解析】此题考查宏的定义形式。由于宏定义并不是语句,故#define后面不能有#include分号,故该程序有错无法输出结果,所以,正确答案:D。  #define f(x) x*x*x  例2:()以下函数的功能是:通过键盘输入数据,为数组中的所有元素main() 赋值。  #define N 10  {int a=3,s,t;  s=f(a+1); & &t=f((a+1));  第 56 页 & & & 共 61 页  聪智学校  printf(”%d,%d\n“,s,t);  }程序运行后的输出结果是(A)  A)10,64 & & &B)10,10 & & & & &C)64,10 & & & & D)64,646.知识点:free()函数  ? 函数原型:void free(void *p); ? 功能:释放p所指的内存区【解析】本题考点为带参数的宏定义,宏定义中的参数没有类型,仅为字符序列,7.知识点:malloc()函数不能当作表达式运算。宏展开时,把实参字符串原样写在替换文本中。? 函数原型:void *malloc(unsigned size);s=f(a+1)=a+1*a1*a+1=10;t=f((a+1))= (a+1)* (a+1)* (a+1)=64 ? 功能:分配size字节的存储区 例2:()有以下程序 例1:()以下程序运行后的输出结果是 & emoclew & 。 #define S(x) 4*(x)*x+1 main() main() { &char *p; { int k=5,j=2; p=(char *)malloc(sizeof(char)*20);printf(”%d\n“,S(k+j)); strcpy(p,”welcome“);for(i=6;i>=0;i--) put*(p+i)); }程序运行后的输出结果是(B)A)197 & & & & & & B)143 & & & & &C)33 & & & & & &D)28 printf(”\n“); free(p);} 【解析】#define宏定义,只是机械简单的置换S(k+j)= S(5+2)=4*(5+2)*5+2+1=143 【解析】(char *)malloc(sizeof(char)*20)申请一个20个字符大小的空间,首地址赋4.知识点:文件包含给字符指针变量p,strcpy(p,”welcome“);将字符串”welcome“赋值给p所指向的空间,? 一般形式:#include 或者#include ”文件名“for循环实现从后往前输出这个字符串,free(p)为释放申请的空间。  ? 与” “的区别:即系统到存放C库函数头文件的目录中寻找要包含的文8.知识点:文件的概念和文件指针  件;” “即系统先在用户当前目录中寻找,若找不到,再到存放C库函数头文件的目录中寻找。 ? 文件包含可以嵌套。  ? 凡是以”#“开头的行都是预处理命令行。  ? 在C程序中文件可以用顺序方式存取,可以用随机方式存取。 ? C程序把文件分为ASCII文件(文5.知识点:calloc()函数  ? 函数原型:void *calloc(unsigned n,unsigned size);? 功能:分配n个数据项的内存连续空间,每个数据项的大小为size第 57 页 & & & 共 61 页  聪智学校  C)可以在原有内容后追加写 & & & & & & &D)可以随意读和写【解析】文件打开方式,‘w’只能向该文件写入,如打开的文件不存在则以指定式,分为二进制文件和ASCII码文件。一个C文件时一个字节序列或者二进制序的文件名建立文件,如存在,则先删除再重建一个文件。故选B。  列,而不是一个记录(结构)序列。 ? 若不能实现打开任务,fopen函数将带回一个空指针值NULL。 ? 文件类型指针:FILE *fp;fp是一个指向FILE类型结构体的指针变量,通过例1:()以下程序用来判断指定文件是否能正常打开,请填空。  文件指针变量找到与它相关的文件。 #include例2:()以下程序打开新文件f.txt,并调用字符输出函数将a数组中的main() 字符写入其中,请填空。 {FILE * #includeif(((fp=fopen(”test.txt“,”r“))== &main() printf(”未能打开文件!\n); &* else &char a[5]={?1?,?2?,?3?,?4?,?5?},i; printf(“文件打开成功!\n”); fp=fopen(“f.txt”,“w”); } for(i=0;i<5;i++) fputc(a[i],fp); 【解析】考查文件打开操作。打开文件使用fopen函数,正常打开时返回指向该文件的文件指针,否则返回值为NULL;题目中当if条件表达式成立时,输出“未能fclose(fp);打开文件!”,故fopen函数返回值为NULL。正确答案:NULL。 }  (2)fclose()函数 【解析】本题考点为文件的基本概念。正确答案为C。C语言中根据数据的组织形9.知识点:fopen()函数和fclose()函数(1)fopen函数  ? 调用方式:fp=fopen(“file1”,“r”); ? 调用方式:fclose(fp); ? 顺利完成关闭操作,返回值为0,否则返回EOF(-1)。 ? 使用文件方式:如“r”只读打开一个文? fgetc()函数的调用形式:ch=fgetc(fp);从打开的文件fp中读取一个字符。 件;“a”追加打开一个文例1:()设fp已定义,执行语句fp=fopen(“file”,“w”);后,以下针对文本? fputc()函数的调用形式:fputc(ch,fp);将字符输出到fp所指向的文件中去。 文件file操作叙述的选项中正确的是(B) 11.知识点:fread()函数和fwrite()函数A)写操作结束后可以从头开始读 & & & & &B)只能写不能读 ? fread()函数的调用形式:fread(buffer,size,count,fp);其中buffer是一个指针,size第 58 页 & & & 共 61 页  聪智学校  是每个数据块的字节数,count是每次读入数据块的个数,fp是文件指针。 例1:struct stud & & &{char name[10]; & & & & & &}stu[40];假设学生的数据已存放在磁盘文件中,如何读入40个学生的数据? for(i=0;i<40;i++)  ,1,fp);  for(i=0;i<3;i++) &fscanf(fp,“%d%d”,&k,&n); fclose(fp);printf(“%d,%d\n”,k,n);  }程序运行后的输出结果是 & (C) &A.1,2 & B.3,4 & C.5,6 & &D.123,456【解析】第一次fp=fopen(“d2.dat”,“w”);以写方式打开,通过循环将a数组全部写入文件中,并且每行写一个;第二次fp=fopen(“d2.dat”,“r”); 以写方式打开,然后通过循环每次读取两个数字给k和n,第三次k和n分别得到5和6? fwrite()函数的调用形式:fread(buffer,size,count,fp);其中buffer是输出数据的首例1:()有以下程序地址。  #includemain() {FILE *f;  f=fopen(“filea.txt”,“w”); fprintf(f,“abc”); fclose(f);}若文  A)helloabc & & & & & B)abclo & & & & &C)abc & & & & & D)abchello【解析】程序中定义了一个文件指针,然后用fopen()函数,以写的方式打开文件“filea.txt”,并让指针f指向它,执着调用fprintf()函数,将“abc”写到指针所指向的文件中。由于filea.txt里原来的内容“hello”被“abc”覆盖掉,所以文件“filea.txt”里,最后的内容为“abc”,本题答案选C。  第 59 页 & & & 共 61 页  12.知识点:fscanf()函数和fprintf()函数? fscanf(文件指针,格式控制字符串,输入列表); ? fprintf(文件指针,格式控制字符串,输出列表); 例1:()有以下程序 #includemain() {FILE &*int &k,n,i,a[6]={1,2,3,4,5,6}; fp=fopen(“d2.dat”,“w”);for(i=0;i<6;i++) fprintf(fp,“%d\n”,a[i]); fclose(fp);fp=fopen(“d2.dat”,“r”);  聪智学校  13.知识点:fgets()函数和fputs()函数  串共有n个字符,把它们放到字符数组str中。  ? 调用形式:rewind(fp);  ? fgets(str,n,fp);从fp指向的文件输入n-1个字符,在最后加一个?\0?,得到字符? 功能:使位置指针重新返回文件的开头。  15.知识点:fseek()函数  ? 调用形式:fseek(fp,100L,0);将位置指针移到离文件头100个字节处。 ? 文件首 SEEK_SET 0 & & & & 文件当前位置 SEEK_CUR 1文件末尾 SEEK_END 2  ? fputs(“China”,fp);把字符串“China”输出到fp指向的文件,字符串末尾?\0?不输? 功能:改变文件的位置指针出。  ()有以下程序 #includemain(){FILE *char str[10]; fp=fopen(“myfile.dat”,“w”); fputs(“abc”,fp);fclose(fp); fp=fopen(“myfile,data”,“a+”); fprintf(fp,“%d”,28);16.知识点:ftell()函数  ? ftell(fp);  ? 功能:得到流式文件中的当前位置。  17.知识点:feof()函数  ? feof(fp);  ? 判断文件是否结束,结束,返回值为1,否则为0。 例1()以下程序运行后的输出结果是 【15】 。 rewind(fp);main()  fscanf(fp,“%s”,str);puts(str);  { &FILE * int x[6]={1,2,3,4,5,6},i;  fclose(fp); fp=fopen(“test.dat”,“wb”);fwrite(x,sizeof(int),3,fp); }程序运行后的输出结果是(C)rewind(fp);  A)abc & & & & & &B)28c & & & & &C)abc28 & & & & &D)因类型不一致而出错fread(x,sizeof(int),3,fp);  【解析】以“a+”方式打开一个已存在的文件,原有文件内容不被删除,位置指 & for(i=0;i<6;i++) printf(“%d”,x[i]); 针移到文件末尾,可作添加和读操作。fputs(“abc”,fp);把字符串“abc”输出到fp指向 & printf(“\n”);fclose(fp); 的文件。  }  14.知识点:rewind()函数  答案:123456  第 60 页 & & & 共 61 页  聪智学校  1,2,3输出到文件中  将文件的内容读出并存到x  写到数组的前三个元素中去,所有数组中的元素第 61 页 & 共 61 页 &【解析】fwrite(x,sizeof(int),3,fp);将数组内的前三个元素即去,rewind(fp);文件回到开头,fread(x,sizeof(int),3,fp);数组的前三个元素中,把1,2,3值均没变。
热门新闻资讯
推荐新闻资讯
最新新闻资讯}

我要回帖

更多关于 fseek fp 20 2 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信