全国二级C知识点总结5 您所在的位置:网站首页 void类型函数调用时不可作为 全国二级C知识点总结5

全国二级C知识点总结5

2024-05-17 11:44| 来源: 网络整理| 查看: 265

本课重要知识点:

1、知识点:函数的概述

l C源程序是由函数组成的,函数由函数首部与函数体组成,函数体包括声明部分和执行语句部分组成。

l C语言程序可以由多个源程序组成,其中一个源程序文件包含main函数,其他函数可以写在另外的源程序文件中,为单独文件,并且可以单独编译。

例1:(10-03-11)以下叙述正确的是( B )

A)C语言程序是由过程和函数组成的

B)C语言函数可以嵌套调用,例如:fun(fun(x))

C)C语言函数不可以单独编译

D)C语言中除了main函数,其他函数不可以作为单独文件形式存在

【解析】选项A错误,C语言中没有过程的概念;选项B正确,C语言可以嵌套调用(此知识点在后面介绍);选项C错误,C语言中可以对包含一个或多个函数的源程序单独编译;选项D错误,C语言函数可以单独存在。

l C程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。main 函数可以调用其它函数,而不允许被其它函数调用。一个C源程序必须有,也只能有一个主函数main。

例1:下列叙述中正确的是( C )

A)C语言程序将从源程序中第一个函数开始执行

B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行

C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束

D)main可作为用户标识符,用以命名任意一个函数作为主函数。

l 在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。

例1、下列叙述中正确的是( D )

A)每个C程序文件中都必须要有一个main()函数

B)在C程序中main ()函数的位置是固定的

C)C程序中所有函数之间都可以是固定的

D)在C程序的函数中不能定义另一个函数

【解析】一个C源程序可以由多个C程序文件,但只能有一个main()函数,并不是每个C程序文件都必须要有一个main(),main()函数可以放在任意位置,且不允许被其他函数调用,因此正确答案是D。

2、知识点:函数的定义

例1:以下正确的函数定义形式是:(C)

A)double fun(int x,int y);{} B)double fun(int x ;inty){}

C) double fun(int x,int y){} D) double fun(int x, y);{}

【解析】在函数中对形参的说明,要求对每个形参都必须说明类型,各参数之间用“,”隔开,函数定义后应无“;”。

l 函数返回return语句的一般形式:return 表达式;或return (表达式);

在函数中允许有多个return语句,但每次只能有一个return语句被执行。

例1:(10-03-24)以下关于return语句叙述中正确的是( B)

A)一个自定义函数中必须有一条return语句

B)一个自定义函数中可以根据不同情况设置多条return语句

C)定义void类型的函数中可以有带返回值的return语句

D)没有return语句的自定义函数在执行结束时不能返回到调用处。

【解析】自定义函数中可以没有return语句(如不需要返回值的函数,常见void类型)),可以有多条return语句(如在分支结构中,可以从不同分支中返回到调用程序,常见if..else);定义成void类型的函数,不允许从该函数取得返回值,也不允许使用return语句。没有return语句的函数在执行到函数的最后一条语句后自动返回达到调用处。

Ø 函数值的类型与函数定义中函数的类型保持一致,如不一致,以函数类型为准。

例2:(06-04-23)已定义以下函数

intfun(int *p){return *p;} fun函数返回值是( B )

A)不确定的值 B)一个整数 C)形参P中存放的值 D)形参P的地址值

【解析】函数返回性类型取决于定义函数时函数名称前的类型,fun前是int,表明函数fun执行完毕后返回一个整型数。正确答案:B

Ø return 后的表达式可以是常量、变量、表达式,也可以空。

如:return ; return 0; return a; return (a+b);

3、知识点:形参和实参及函数调用

l 形参出现在函数定义中(即定义函数时函数名后面括号中的参数),实参出现在主调函数中(调用函数时函数名后面括号中的参数)

l 形参在本函数体内都可以使用,离开该函数则不能使用。实参在主调函数中内有效,进入被调函数后,实参变量也不能使用。(注:在进行函数调用时,函数必须有确定的值)

l 实参向形参单向传递数值,不能将形参的值反向的传送给实参。实参和形参在数据上、类型上、顺序上要一致。在函数调用过程中,形参的变化不会改变实参的变化。

例1、(09-09-24)有以下程序

#include

void fun(int p)

{ int d=2; p=d++;printf(“%d”,p); }

main()

{ int a=1;

fun(a); printf(“%d\n”,a);

} 程序运行后的输出结果是( C)

A) 32 B)12 C)21 D)22

【解析】此题考点为函数参数的传递。C语言中函数参数的传递是值传递,是把实参的值传给形参,是单向传递,形参的改变不会影响到实参的值。程序中,把实参a的值传给形参p,p=1,然后p=d++,再次赋值后p=2,输出p的值2。返回到主程序中,输出a的值为1。(形参p的改变不会影响到实参a的值,a的值仍为1).因此答案为C.

l 在传递数值时,形参和实在分别占据不同的存储单元(形参变量只有在被调用时才分配内存单元,调用结束后,即刻释放分配的内存单元)

例1、(07-04-25)若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( D)

A)函数的实参和其对应的形参共占同一存储单元

B)形参只是形式上的存在,不占用具体存储单元

C)同名的实参和形参占同一存储单元

D)函数的形参和实参分别占用不同的存储单元

【解析】本题考点是函数的参数定义,在函数中,主调数中里边的参数叫做实参,而被调函数里边的参数叫做形参,当函数传递时,传递的是值,它们占用的不是同一存储单元,而且在传递中,是单向传的,由实参传向形参。

l “传值”与“传址”的区别:传数值的话,形参的变化不会改变实参的变化。传地址的话,形参的变化就有可能改变实参所对应的量。

例1:(10-03-26)有以下程序

#include

void fun(char *c,int d)

{ *c=*c+1; d=d+1;

printf(“%c,%c”,*c,d);

}

main()

{ char b=’a’, a=’A’;

fun(&b,a);

printf((“%c,%c\n”,b,a);

} 程序运行后的输出结果是(A)

A) b,B,b,A B)b,B,B,A C)a,B,B,a D)a,B,a,B

4、知识点:函数调用的一般形式和调用方式

l 函数调用的一般形式为:函数名(实际参数表);

实参可以是常数、变量或其他构造类型数据及表达式,也可以没有(当为无参函数时)

l 函数调用的方式:

(1)函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式运算。例如:z=max(x,y);

(2)函数语句:函数调用的一般形式上加上分号。例如:printf(“%d\n”,a);

(3)函数实参:函数作为另一个函数调用的实际参数出现。例如:printf(“%d”,max(x,y));

l 程序从main函数进入,上往下执行,当碰到函数名后,把值传给调用函数,当程序得到了返回值或调用函数结束,再顺序往下执行,最后到main函数结束。

5、知识点:函数的声明及其位置

l 函数要“先定义后调用”,或“先声明再调用后定义”。函数的声明一定要有函数名、函数返回值类型、函数参数类型,但不一定要有形参的名称。

一般形式为:

类型说明符被调函数名(类型形参,类型形参…);

或 类型说明符被调函数名(类型,类型…);

注意:其末尾“;”不能省

例如:int max(int a,int b); 或 int max(int ,int); 两者功能相同

例1、(06-09-32)若有以下函数首部

int fun(double x[10],int *n)

则下面针对此函数声母语句中正确的是(D)

A)int fun(double x,int *n); B)int fun(double,int);

C)int fun(double*x,int n); D)int fun(double *,int。);

【解析】本题考点是对函数的声明,在函数声明的时候,其格式如下:返回值类型函数名(参数类型[参数名],参数类型[参数名]……)其中,参数名可以不写,但是参数类型一定要写全

l 省去主调函数中对被调函数的函数说明的几种情况:

(1)被调函数的返回值是整型或字符型时(返回值自动按整型处理)

(2)当被调函数的函数定义在主调函数之前时

(3)在所有函数定义之前,在函数外预先说明了各个函数的类型

例2:(10-09-24)有以下程序

#include

int f(int x);

main()

{ int n=1,m;

m=f(f(f(n))); printf(“%d\n”,m);

}

int f(intx)

{ returnx*2;}

程序运行的输出结果( D )

A) 1 B)2 C)4 D)8

【解析】f函数定义在main下面,但在外部进行声明int f(int x);因此在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

例3:(11-03-12)有以下程序,请在 【12】处填写正确语句,使程序可正常编译运行。

【12】;

main()

{ doublex,y,(*p)();

scanf("%lf%lf",&x,&y);

p=avg;

printf("%f\n",(*p)(x,y));

}

double avg(double a,double b)

{ return((a+b)/2);}

答案:double avg(double a,doubleb); 或double avg(double ,double );

【解析】当函数定义在调用之后,调用前必须对函数进行申明,申明的形式和函数定义中的函数头部分相同,最后加分号即可。

6、知识点:函数的嵌套调用

l C语言中不允许作嵌套的函数定义,但是允许在一个函数的断定仪中出现对另一个函数的调用,即嵌套调用。

例1:(06-04-33)有以下程序

intfunl(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);

}

main()

{double w;w=fun2(1.1,2.0);……}

程序执行后变量w中的值是( C )

A)5.2l B)5 C)5.0 D)0.0

【解析】此题考查函数的嵌套调用。main函数中调用了fun2函数;fun2函数中又调用了如fun1函数w=fun2(1.1,2.0)-->w=(int)(funl(1.1)+funl(2.0))àw=(int)5.21;w值为5,但是w是double类型变量,故将5转换成5.0赋值给变量w

例2、(09-3-24)有以下程序

#include

int 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 )

A) 10 B)9 C)8 D)7

【解析】程序的main()函数中,定义了4个变量,前3个分别初始化,D用来接收调用函数后返回的值,主函数一共调用了3次f()函数,第一次传递a,b的值,给形参x,y,返回(y-x)*x的值为3,第二次将a,c的值传递给形参x,y,返回(y-x)*x的值为6,接着将f(a,b),f(a,c)的值3、6传递给形参,执行后返回值9,赋值变量d,最后输出结果为9

7、知识点:函数的递归调用

l 函数直接或间接地调用自己称为函数的递归调用。递归调用必须有一个明确的结束递归的条件。在做递归题时可把递归的步骤一步步写下来,不要弄颠倒了。

例1、(04-09-37)在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,则 ( B )

A)称为函数的直接递归调用

B)称为函数的间接递归调用

C)称为函数的循环调用

D)C语言中不允许这样的递归调用

【解析】此题考查函数递归的基本概念。一个函数直接或间接调用自己称为函数的递归调用;若直接调用了自己,则称为直接递归调用,若间接调用了自己则称为间接递归调用;根据间接递归调用的概念可知,本题中的函数调用为间接递归调用。

例2、(09-09-15)

#include

fun(int x)

{ if(x/2>0) fun(x/2);

printf(“%d ”,x);

}

main()

{ fun(6); printf(“\n”);}程序运行后的输出结果是__1 3 6______

【解析】程序的执行过程是先递推、后递归的过程。当x=1时,条件不成立,递推终止。程序执行流程参照示意图。

例3:(10-03-33)有以下程序

#include

int f(int t[],intn);

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);

elsereturn 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)

{ if(k 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()

{ inta=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)为6

8、知识点:局部变量和全局变量

l 在一个函数内部或复合语句内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在函数以外是不能使用这些变量的。这称为局部变量,局部变量又称为内部变量。函数的形参也属于局部变量。

l 在函数外部定义的变量,称为全局变量,又称为外部变量。全局变量可以被本文件的其他函数所共用。

例1、(07-09-40)在一个C语言源程序文件中所定义的全局变量,其作用域为(D)

A)所在文件的全部范围 B)所在程序的全部范围

C)所在函数的全部范围 D)由具体定义位置和extem说明来决定范围

【解析】本题考点是全局变量的作用域,全局变量的作用域是,从变量定义开始,一直到程序程结束为止,当然,也可以在其它文件中用这个以定义的全局变是,但是要通过extern来进行声明,本题答案选D。

例2、(09-09-11)有以下程序

#include

int a=5;

void fun(int b)

{ int a=10;a+=b;

printf(“%d”,a)

}

main()

{ int c=20;

fun(c); a+=c;

printf(“%d\n”,a);

}程序运行后的输出结果是____3025____

【解析】全局变量的作用域为定义开始到文件结束。局部变量的作用域为定义其函数内部。当局部变量与全部变量同名时,在局部变量作用域内,全部变量不起作用。

执行函数fun(c): 实参c 将值传给形参b,即b=20,函数内部定义局部变量a起作用,a=10,a+=b a=a+b=10+20=30,输出a的值为30

返回到主函数: a+=c 此时a为全局变量的值 a=a+c=5+20=25 输出a值25

注意格式控制符无空格,所以连续输出

9知识点:变量存储类别(auto变量、register变量、static变量)

Ø 静态变量(static):

(1)在编译时分配存储空间,所占存储单元直到程序结束时才释放,它的值在程序运行过程中一直存在,且变量的初始化只进行一次。

(2)static说明符可以用于全局变量,也可用于局部变量(auto和resgiter不可以定义全局变量)但是,当它说明变量后,只要这个变量还在程序中存在,那么不管用到还是没有用到,它都将会占用内存单元。

例1:(10-09-36)有以下程序:

#include

int f()

{ static int x=1;

x+=1; return x;

}

main()

{ int i,s=1;

for(i=1;i



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有