C语言知识点整理 下载本文

4.字符串比较函数

strcmp(字符串1,字符串2),作用是比较字符数1和字符串2,如果字符串1=字符串2,则函数值为0;如果字符串1>字符串2,则函数值为一个正数;如果字符串1<字符串2,则函数值为一个负数。

2.字符数组应用

【例1】下列语句中存在语法错误的是______。(2006.09) A)char ss[6] [20]; ss[1]= \ B)char ss[ ] [20]={ \C)char *ss[6]; ss[1]= \D)char ss[ ]={ \

第5章 函数

考点1 函数的定义

1.一个C语言程序是由一个主函数和若干个其它函数组成的。 2.函数定义的一般形式:

类型标识符 函数名(形式参数表列)

{ 说明部分 语句部分 }

例如:

int sum(int a,int b) {

int c; c=a+b; return(c); }

(1)类型标识符定义了该函数的类型,即函数执行结束时返回值的类型,它可以为任何一种类型,如整型、实型、字符型、结构体型、指针型等,还可以为void型,表示该函数无返回值。当省缺类型标识符时,返回值类型为整型。 (2)函数名是一个标识符,命名规则应遵守标识符命名规则,且应避免重名。 (3)形式参数简称形参,用于调用函数与被调用函数之间的数据传递,其中每个参数的类型必须在形式参数表列中逐一说明。当没有参数时,形式参数表列外面的一对圆括号不能省。

(4)由{}括起来的部分称为函数体,它由说明部分和语句部分组成。说明部分主要用于对本函数内要用到的变量及类型进行定义。语句部分由若干(可以为0)个语句组成。对于有返回值的函数,通常包含一个return语句。

3. return 表达式;或return (表达式); 该表达式的值要与函数类型相同或相容。

11

return ;无函数值返回。

以下叙述中错误的是_____。(2008.09)

A)用户定义的函数中可以没有 return 语句 B)用户定义的函数中可以有多个 return 语句,以便可以调用一次返回多个函数值

C)用户定义的函数中若没有 return语句,则应当定义函数为 void 类型 D)函数的 return 语句中可以没有表达式

在C语言中,函数返回值的类型最终取决于_____。 (2007.04)

A)函数定义时在函数首部所说明的函数类型 B)return 语句中表达式值的类型

C)调用函数时主调函数所传递的实参类型 D)函数定义时形参的类型

考点2 函数的调用

1.函数定义后就可以对它进行引用,即调用函数。

(1)函数调用的一般形式为: 函数名(实参表列);例如: sum(3,4); (2)函数名为函数定义时的名字。

(3)实参表列中的实参个数要与形参表中的形参个数相等,类型一致,实参与形参按顺序对应。如果是调用无参函数,则\实参表列\为空,但圆括号不能省略。

2.函数有两种参数传递方式:值传递和地址传递。 (1)值传递只能由实参单向传递给形参,与值参数对应的实参允许是表达式。 (2)地址传递,形参与实参占用同一段内存区,其值是共享的,可以理解为相互传递。对于地址传递,实参只能是数组名、指针变量等。

例1、下面的函数调用语句中 func函数的实参个数是_______。(2008.09) func (f2(v1, v2), (v3, v4, v5), (v6, max(v7, v8)));

A)3 B)4 C)5 D)8

例2、int fun1(double a){return a*=a;} int fun2(double x,double y) { double a=0,b=0;

a=fun1(x);b=fun1(y);return(int)(a+b); }

main( )

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

程序执行后变量w中的值是_______。(2006.04)

A)5.21 B)5 C)5.0 D)0.0

考点3 数组作为函数参数

12

1. 数组作为函数参数有两种情况

(1)数组元素作为函数参数,它相当于一般的简单变量,属于值传递。 (2)数组名作为函数参数,由于数组名代表了数组的首地址,因而是地址传递,此时实参与形参都应使用数组名或对应的指针变量。

2.形参数组可以不指定数组的大小。

(1)一维数组名后面跟一对空的方括号,即不指定一维数组的大小。

(2)二维数组名后有两对方括号,第一对方括号内的内容可以省略,即不指定该数组有多少行,第二个方括号中的内容不允许省略,必须指定该数组每行有多少列。

【例1】有以下程序 #include void fun(int a[], int n) { int i, t;

for(i=0; i

main()

{ int k[10]={1,2,3,4,5,6,7,8,9,10}, i; fun(k,5);

for(i=2; i<8; i++) printf(\printf(\}

程序的运行结果是_____。(2008.09)

A)345678 B)876543 C)1098765 D)321678

【例2】有以下程序 #include #define N 4

void fun(int a[][N], int b[]) { int i;

for(i=0; i

{ int x[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N], i; fun(x,y);

for (i=0; i

程序的运行结果是______。(2008.09)

A)l,2,3,4, B)1,0,7,0, C)1,4,5,9, D)3,4,8,10

考点4 函数的递归调用

函数的递归调用,是指一个函数可以直接或间接地调用自身,前者称为直接递归,

13

后者称为间接递归。 例1、在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,则( )

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

C)称为函数的循环调用 D)C语言中不允许这样的递归调用

【例2】有以下程序 #include int fun(int a,int b) { if(b==0) return a;

else return(fun(--a,--b)); }

main()

{ printf(\}

程序的运行结果是_______。(2008.09)

A)1 B)2 C)3 D)4 例3、

#include int f(int x) {

int y;

if(x==0||x==1) return (3); y=x*x-f(x-2); return y; }

main() {

int z; z=f(3);

printf(\}

程序的运行结果是_______。(2008.04)

A)0 B)9 C)6 D)8

考点5 局部变量与全局变量

1.根据变量作用域不同,可将变量分为局部变量和全局变量。

(1)在一个函数内部定义的变量,它只在本函数范围内有效,称之为局部变量。

14

(2)在函数之外定义的变量称为外部变量,它的有效范围从定义变量的位置开始到本源文件结束。

2.如果全局变量和局部变量重名,在局部变量的作用范围内局部变量起作用。

【例1】在一个C源程序文件所定义的全局变量,其作用域为_________。(2007.09)

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

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

【例2】有下列程序: void fun2(char a, char b) {printf(\ }

char a='A',b='B';

void fun1( ){a='C'; b='D' ; } main( ) { fun1( );

printf(\fun2('E','F'); }

程序的运行结果是________。(2006.09)

A)C D E F B)A B E F C)A B C D D)C D A B

考点6 变量的存储类型

在C语言中,每个变量和函数有两个属性:数据类型和数据存储类型。存储类型是指数据在内存中的存储方法。存储类别分为两大类:动态存储类和静态存储类。 1.局部变量的存储方式 (1)auto变量

只要不在变量前面加关键字static,无论在变量前面是否加关键字auto,这些局部变量都是自动变量(auto),自动变量在内存中动态存储。对这类数据,函数调用开始时为它们分配存储空间,函数结束释放这些空间。 (2)static变量

在变量前面加关键字static的局部变量,系统为它们在静态存储区分配内存。这类变量的值在函数调用结束后,它们所占的存储单元仍不释放。在下一次调用函数时,这些变量已经有值,就是上次调用函数结束时的值。 (3) register变量

在变量前面加关键字register的局部变量称为寄存器变量,它们的值是存储在CPU的寄存器中的,计算机对寄存器的存取速度远远高于对内存的存取。它属于动态存储类别,只有使用时才为它分配存储空间。

2.全局变量的存储方式

(1)全局变量全部存储在静态存储区。在程序开始执行时系统即给全局变量分配存储区,在整个程序结束时才释放,在程序执行过程中,它们占据固定的存

15