第八章函数 学习目的与要求:1.重点掌握函数的定义与调用 2.理解函数参数的传递机制--传值调用和传址调用。 3.理解变量存储类型的概念及各种存储类型变量的生存期和有效 范围 4.了解函数的嵌套调用与递归调用 5.重点理解、掌握数组作为函数参数 1.函数的定义和调用。 2.函数形参和实参。 3.数组作为函数参数 4.变量的存储类别 第1讲 知识归纳 1.函数概述 (1)一个源程序文件由一个或多个函数组成。 (2)一个c程序由一个或多个源程序文件组成 (3)C程序的执行从man函数开始到manO函数结束。 (4)所有函数都是平行的,函数不能嵌套定义。 2.函数定义形式 函数类型函数名(形参列表) 函数体 return(表达式) (1)形参列表样式:intx,inty,注意:每个形参都有类型 (2)函数类型原则上要求与 return后表达式类型一致,如不一致,表达式类型强制转换 成函数的类型。如函数的确不需要返回值,设为void型; (3) retum语句作用:一是带返回值到函数调用处。 是将流程返回函数调用处:如果该函数没有返回值,可以省略 return,最后的}也具 有将流程返回调用处的功能
第八章 函 数 学习目的与要求:1. 重点掌握函数的定义与调用。 2. 理解函数参数的传递机制----传值调用和传址调用。 3. 理解变量存储类型的概念及各种存储类型变量的生存期和有效 范围。 4. 了解函数的嵌套调用与递归调用。 5. 重点理解、掌握数组作为函数参数。 重点: 1. 函数的定义和调用。 2. 函数形参和实参。 3. 数组作为函数参数。 4. 变量的存储类别。 第 1 讲 知识归纳 1. 函数概述 (1) 一个源程序文件由一个或多个函数组成。 (2) 一个 c 程序由一个或多个源程序文件组成。 (3) C 程序的执行从 main 函数开始到 main()函数结束。 (4) 所有函数都是平行的,函数不能嵌套定义。 2. 函数定义形式 函数类型 函数名(形参列表) { 函数体 return(表达式); } (1) 形参列表样式: int x, int y ,注意:每个形参都有类型。 (2) 函数类型原则上要求与 return 后表达式类型一致,如不一致,表达式类型强制转换 成函数的类型。如函数的确不需要返回值,设为 void 型; (3) return 语句作用:一是带返回值到函数调用处。 二是将流程返回函数调用处;如果该函数没有返回值,可以省略 return,最后的}也具 有将流程返回调用处的功能
C语言程序设计上机指导与同步训练 如: int Max(intx,inty) y ? x:y. return (z)i (4)如何确定一个函数是否需要返回值?即是否需要 return语句—要看函数调用语 句是否被使用,如函数调用语句是一个独立语句,就不需要返回值,函数类型为void型; 如函数调用语句是表达式或语句的一个成分,则需要返回值,返回值类型决定函数类型 3.函数调用形式 函数名(实参列表) (1)实参列表:如Max(a,b);,a.b必须是已经有具体值或被赋值 (2)注意区分:实参与形参 函数定义时,是形参,每个形参前要有类型 函数调用时,是实参,可以是常量、常量表达式、已赋值的变量等 (3)要求:实参与形参,个数相等,类型一致,即匹配 (4)传值调用机制:当函数调用时,系统给形参分配临时存储空间,实参传值给形参 当函数调用结束,流程返回主调函数,形参的存储空间被释放 传值调用是单向的,即形参的改变不影响实参。 4.函数声明 当函数定义在后,调用在前时,要在调用前添加函数声明语句。 函数声明语句的格式:■部+“:” 如: int Max( 当函数定义在前,调用在后时,可以不加函数声明。 基础训练(A 、选择题 1.C语言程序由函数组成,它的() A)主函数必须在其他函数之前,函数内可以嵌套定义函数 B)主函数可以在其他函数之后,函数内不可以嵌套定义函数 C)主函数必须在其他函数之前,函数内不可以嵌套定义函数 D)主函数必须在其他函数之后,函数内可以嵌套定义函数 2.以下说法中正确的是()。 A)C语言程序总是从第一个定义的函数开始执行 B)在C语言程序中,要调用的函数必须在manO函数中定义 C)C语言程序总是从 maino函数开始执行 D)C语言程序中的man函数必须放在程序的开始部分 3.在函数的定义格式中,必须使用C保留字的部分是()。 A)类型修饰符 B)函数名 C)形式参数表 D)函数体
·202· C 语言程序设计上机指导与同步训练 ·202· 如:int Max( int x , int y) { int z ; z = x > y ? x : y ; return ( z); } (4) 如何确定一个函数是否需要返回值?即是否需要 return 语句——要看函数调用语 句是否被使用,如函数调用语句是一个独立语句,就不需要返回值,函数类型为 void 型; 如函数调用语句是表达式或语句的一个成分,则需要返回值,返回值类型决定函数类型。 3. 函数调用形式 函数名(实参列表); (1) 实参列表:如 Max( a , b ); a,b 必须是已经有具体值或被赋值; (2) 注意区分:实参与形参; 函数定义时,是形参,每个形参前要有类型; 函数调用时,是实参,可以是常量、常量表达式、已赋值的变量等; (3) 要求:实参与形参,个数相等,类型一致,即匹配; (4) 传值调用机制:当函数调用时,系统给形参分配临时存储空间,实参传值给形参, 当函数调用结束,流程返回主调函数,形参的存储空间被释放。 传值调用是单向的,即形参的改变不影响实参。 4. 函数声明 当函数定义在后,调用在前时 ,要在调用前添加函数声明语句。 函数声明语句的格式:函数首部 + “;” 如: int Max( int x, int y ) ; 当函数定义在前,调用在后时,可以不加函数声明。 基础训练(A) 一、选择题 1. C 语言程序由函数组成,它的( )。 A) 主函数必须在其他函数之前,函数内可以嵌套定义函数 B) 主函数可以在其他函数之后,函数内不可以嵌套定义函数 C) 主函数必须在其他函数之前,函数内不可以嵌套定义函数 D) 主函数必须在其他函数之后,函数内可以嵌套定义函数 2. 以下说法中正确的是( )。 A) C 语言程序总是从第一个定义的函数开始执行 B) 在 C 语言程序中,要调用的函数必须在 main()函数中定义 C) C 语言程序总是从 main()函数开始执行 D) C 语言程序中的 main()函数必须放在程序的开始部分 3. 在函数的定义格式中,必须使用 C 保留字的部分是( )。 A) 类型修饰符 B) 函数名 C) 形式参数表 D) 函数体
第二部分¢语言程序设计同步训练 203 4.若调用一个函数,且此函数中没有 return语句,则正确的说法是()。 该函数 A)没有返回值 B)返回若干个系统默认值 C)能返回一个用户所希望的函数值 D)返回一个不确定的值 5.以下不正确的说法是()。 C语言规定 A)实参可以是常量、变量或表达式 B)形参可以是常量、变量或表达式 C)实参可以是任意类型 D)形参应与其对应的实参类型一致 C语言规定,函数返回值的类型是由() A) return语句中的表达式类型所决定 B)调用该函数是的主调函数类型所决定 C)调用该函数时系统临时决定 D)在定义该函数时所指定的函数类型所决定 7.以下错误的描述是() 函数调用可以 A)出现在执行语句中 B)出现在一个表达式中 C)作为一个函数的形参 D)作为一个函数的实参 8.以下正确的说法是() A)定义函数时,形参的类型说明可以放在函数体内 B) return后边的值不能为表达式 C)如果函数值的类型与返回值类型不一致,以函数值类型为准 D)如果形参与实参的类型不一致,以实参类型为准 9.对于某个函数调用,不用给出被调用函数的原形的情况是() A)被调用函数是无参函数 B)被调用函数是无返回值的函数 C)函数的定义在调用处之前 D)函数的定义在别的程序文件中 10.已知函数abc的定义为 id abco 则函数定义中void的含义是()。 A)执行函数abc后,函数没有返回值 B)执行函数abc后,函数不再返回 C)执行函数abc后,可以返回任意类型D)以上三个答案全是错误的 、填空题 1.C语言规定,可执行程序的开始执行点是
第二部分 C 语言程序设计同步训练 ·203· ·203· 4. 若调用一个函数,且此函数中没有 return 语句,则正确的说法是( )。 该函数 A) 没有返回值 B) 返回若干个系统默认值 C) 能返回一个用户所希望的函数值 D) 返回一个不确定的值 5. 以下不正确的说法是( )。 C 语言规定 A) 实参可以是常量、变量或表达式 B) 形参可以是常量、变量或表达式 C) 实参可以是任意类型 D) 形参应与其对应的实参类型一致 6. C语言规定,函数返回值的类型是由( )。 A) return 语句中的表达式类型所决定 B) 调用该函数是的主调函数类型所决定 C) 调用该函数时系统临时决定 D) 在定义该函数时所指定的函数类型所决定 7. 以下错误的描述是( )。 函数调用可以 A) 出现在执行语句中 B) 出现在一个表达式中 C) 作为一个函数的形参 D) 作为一个函数的实参 8. 以下正确的说法是( )。 A) 定义函数时,形参的类型说明可以放在函数体内 B) return 后边的值不能为表达式 C) 如果函数值的类型与返回值类型不一致,以函数值类型为准 D) 如果形参与实参的类型不一致,以实参类型为准 9. 对于某个函数调用,不用给出被调用函数的原形的情况是( )。 A) 被调用函数是无参函数 B) 被调用函数是无返回值的函数 C) 函数的定义在调用处之前 D) 函数的定义在别的程序文件中 10. 已知函数 abc 的定义为: void abc() {......} 则函数定义中 void 的含义是( )。 A) 执行函数 abc 后,函数没有返回值 B) 执行函数 abc 后,函数不再返回 C) 执行函数 abc 后,可以返回任意类型 D) 以上三个答案全是错误的 二、填空题 1. C 语言规定,可执行程序的开始执行点是
C语言程序设计上机指导与同步训练 2.从用户使用的角度看,函数有 两种。 3.从函数的形式看,函数分为 利和 两类。 4.对于有返回值函数,要结束函数运行必须使用语句 5.如果使用库函数,一般还应该在本文件开头用 命令将调用有关库函数时 所需用到的信息“包含”到本文件中。 6.C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是 能力提高(B) 、选择题 1.以下正确的函数形式是()。 A)double fun(int x, int y) B)fun(int x, y z=x+y return z Z C)fun(x,y) D) double fun(int x, int y) fint x, y; double z; i double z ZX+y, return z: j ZX+y return z; i 2C语言中进行乘方运算,例如求a的3次方,可以使用()。 A)a^3 B)a*3 C)pow(a, 3) D)power(a, 3) 3.(多选)从下列函数原形看,返回值类型为int的函数有()。 A)char Fl(int n ) B)int F2(char n); C)F3(int n); D)int F4(float n) 4.(多选)在函数的定义格式中,可以是void的部分有()。 A)类型修饰符B)函数名 C)形式参数表D)函数体 5.下面函数调用语句含有实参的个数为()。 func((expl, exp2),(exp3, exp4, exp5 )); A)1 B)2 D)4 6.以下程序有语法性错误,有关错误的正确说法( main() void prt char ()i k=prt char(G)i A)语句 void prt-char(,有错,它是函数调用语句,不能用void说明 B)变量名不能使用大写字母 C)函数说明和函数调用语句之间有矛盾 D)函数名不能使用下划线 填空题 要在C语言中求sin30的值,则可以调用库函数,格式为
·204· C 语言程序设计上机指导与同步训练 ·204· 2. 从用户使用的角度看,函数有 和 两种。 3. 从函数的形式看,函数分为 和 两类。 4. 对于有返回值函数,要结束函数运行必须使用语句 。 5. 如果使用库函数,一般还应该在本文件开头用 命令将调用有关库函数时 所需用到的信息“包含”到本文件中。 6. C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是: __________。 能力提高(B) 一、选择题 1. 以下正确的函数形式是( )。 A) double fun(int x;int y) B) fun(int x,y) {z=x+y;return z;} {int z; return z;} C) fun( x,y) D) double fun(int x,int y) {int x,y;double z; {double z; z=x+y;return z;} z=x+y;return z; } 2. C 语言中进行乘方运算,例如求 a 的 3 次方,可以使用 ( )。 . A) a^3 B) a**3 C) pow(a,3) D) power(a,3) 3. (多选)从下列函数原形看,返回值类型为 int 的函数有( )。 A) char F1(int n ); B) int F2(char n ); C) F3(int n); D) int F4(float n); 4. (多选)在函数的定义格式中,可以是 void 的部分有( )。 A) 类型修饰符 B) 函数名 C) 形式参数表 D) 函数体 5. 下面函数调用语句含有实参的个数为( )。 func((exp1,exp2),(exp3,exp4,exp5)); A) 1 B)2 C) 5 D)4 6. 以下程序有语法性错误,有关错误的正确说法( )。 main() { int G=5,k; void prt_char(); …… k=prt_char(G); …… } A) 语句 void prt-char();有错,它是函数调用语句,不能用 void 说明 B) 变量名不能使用大写字母 C) 函数说明和函数调用语句之间有矛盾 D) 函数名不能使用下划线 二、填空题 1. 要在 C 语言中求 sin30 的值,则可以调用库函数,格式为
第二部分¢语言程序设计同步训练 205 2.有如下函数调用语句 该函数调用语句中,含有的实参个数是 3.下面add函数的功能是求两个参数的和,并将和值返回调用函数。函数中错误的部 分是 改后为 void add(float a, float b) Float c 阅读程序写出执行结果 1.以下程序的运行结果是 int max (int x int y)i fint a=l, b=2,Ci printf("max is d\n",c) max(int x, int y) return(z) 以下程序的运行结果是 maln incx(); I int x=O printf("x=d\n",++x) 四、程序填空 1.函数 gongyu的作用是求整数numl和num2的最大公约数,并返回该值,请填空。 [temp=numl; numl=num2; num2=temp; 1
第二部分 C 语言程序设计同步训练 ·205· ·205· 2. 有如下函数调用语句: func(rec1,rec2+rec3,(rec4||rec5)); 该函数调用语句中,含有的实参个数是 。 3. 下面 add 函数的功能是求两个参数的和,并将和值返回调用函数。函数中错误的部 分是 ,改后为 。 void add(float a,float b) {float c; c=a+b; return c; } 三、阅读程序写出执行结果 1. 以下程序的运行结果是( )。 #include int max (int x int y); main() {int a=1,b=2,c; c=max(a,b); printf("max is %d\n",c); } max(int x,int y) {int x; z=(x>y)?x:y; return(z); } 2. 以下程序的运行结果是( )。 int incx(); main() {incx(); incx(); incx(); } incx() { int x=0; printf("x=%d\n",++x); } 四、程序填空 1. 函数 gongyu 的作用是求整数 num1 和 num2 的最大公约数,并返回该值,请填空。 gongyu(int num1,int num2) {int temp,a,b; if(num1( _) num2) {temp=num1;num1=num2;num2=temp;} a=num1;b=num2; while(_ ) {temp=a%b;a=b;b=temp;}
·206· C语言程序设计上机指导与同步训练 return(a)i 五、编程题 已有变量定义和函数调用语句:intx=57; Isprime(x);函数 Isprime()用来判断一个整 形数a是否为素数,若是素数,函数返回1,否则返回0。请编写 isprime函数。 第2讲 知识归纳 1.函数的嵌套调用 (1)C语言的函数定义都是互相平行、独立的,即在定义函数时,一个函数内不能包含 另一个函数,即函数定义不能嵌套。 (2)C语言的函数调用可以嵌套,即在调用一个函数的过程中,可以再调用另一个函数。 2.函数的递归调用 修(1)在调用一个函数的过程中,又出现直接或间接地调用该函数本身,称为函数的递 (2)递归的基本格式:以求年龄为例 int age( int n int c if(n==1)c=10; //如果没有这个条件语句,递归就没有终止点 else c=age(n-1)+2 return C 注意:递归就是递推+回归;因此,在写递归调用的结果时,一定注意要回归到函数 调用处执行,然后接着执行它的下一个语句 基础训练(A) 选择题 1.以下正确的描述是()。 在C语言中 A)函数的定义可以嵌套,但函数的调用不可以嵌套 B)函数的定义不可以嵌套,但函数的调用可以嵌套。 C)函数的定义和函数的调用均不可以嵌套 D)函数的定义和函数的调用均可以嵌套。 2.在C语言的函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了 206
·206· C 语言程序设计上机指导与同步训练 ·206· return(a); } 五、编程题 已有变量定义和函数调用语句:int x=57 ; isprime(x); 函数 isprime( ) 用来判断一个整 形数 a 是否为素数,若是素数,函数返回 1,否则返回 0。请编写 isprime 函数。 isprime(int a) { } 第 2 讲 知识归纳 1. 函数的嵌套调用 (1) C 语言的函数定义都是互相平行、独立的,即在定义函数时,一个函数内不能包含 另一个函数,即函数定义不能嵌套。 (2) C 语言的函数调用可以嵌套,即在调用一个函数的过程中,可以再调用另一个函数。 2. 函数的递归调用 (1) 在调用一个函数的过程中,又出现直接或间接地调用该函数本身,称为函数的递 归调用。 (2) 递归的基本格式:以求年龄为例 int age( int n ) { int c; if(n==1) c=10; //如果没有这个条件语句,递归就没有终止点 else c=age(n-1)+2; return c; } 注意:递归就是递推+ 回归 ;因此,在写递归调用的结果时,一定注意要回归到函数 调用处执行,然后接着执行它的下一个语句。 基础训练(A) 一、选择题 1. 以下正确的描述是( )。 在 C 语言中 A) 函数的定义可以嵌套,但函数的调用不可以嵌套。 B) 函数的定义不可以嵌套,但函数的调用可以嵌套。 C) 函数的定义和函数的调用均不可以嵌套。 D) 函数的定义和函数的调用均可以嵌套。 2. 在C语言的函数调用过程中,如果函数 funA 调用了函数 funB,函数 funB 又调用了
第二部分¢语言程序设计同步训练 函数funA,则() A)称为函数的直接递归 B)称为函数的间接递归 C)称为函数的递归定义 D)C语言中不允许这样的递归形式 已知ntf(int)和intg(imt是函数f和g的原形。下列语句中,将函数f作为表达式 调用的有(),将函数f作为函数参数的有()。 A)f(3) B)p=f(3), C)g(f(3); D)f(g(3) 4.(多选)已知 int f(int)和intg(int)是函数f和g的原形。下列语句中,将函数f作为语 句调用的有( A)f(3) B)f(g(3) C)g(f(3); D)p=f(g(3)+1) 、填空题 1.按函数在程序中出现的位置来分,可以有三种函数调用方式: 和 2.如果一函数直接或间接地调用自身,这样的调用称为 3.函数的递归调用分为 两个阶 能力提高(B) 一、阅读程序,写出运行结果。 1.下面程序的运行结果是()。 int funcl (int x) int func2 (int x) main() int x=10 funcl(x) printf("gd\n", x)i funcl( int x) func2(x) printf("gd\n", x); func2(int x) printf("gd\n”,x) 2.下面程序的运行结果是( int sub (int n main() printf("gd\n", sub(i)) sub(int n) if(n==l)return 1
第二部分 C 语言程序设计同步训练 ·207· ·207· 函数 funA,则( )。 A) 称为函数的直接递归 B) 称为函数的间接递归 C) 称为函数的递归定义 D) C语言中不允许这样的递归形式 3. 已知 int f(int)和 int g(int)是函数 f 和 g 的原形。下列语句中,将函数 f 作为表达式 调用的有( ),将函数 f 作为函数参数的有( )。 A) f(3); B) p=f(3); C) g(f(3)); D) f(g(3)); 4. (多选)已知 int f(int)和 int g(int)是函数 f 和 g 的原形。下列语句中,将函数 f 作为语 句调用的有( )。 A) f(3); B) f(g(3)); C) g(f(3)); D) p=f(g(3)+1); 二、填空题 1. 按函数在程序中出现的位置来分,可以有三种函数调用方式: 、 和 。 2. 如果一函数直接或间接地调用自身,这样的调用称为 。 3. 函数的递归调用分为 和 两个阶段。 能力提高(B) 一、阅读程序,写出运行结果。 1. 下面程序的运行结果是( )。 int funcl (int x); int func2 (int x); main() { int x=10; func1(x); printf("%d\n",x); } func1( int x) { x=20; func2(x); printf("%d\n",x); } func2(int x) { x=30; printf("%d\n",x); } 2. 下面程序的运行结果是( )。 int sub (int n) main() {int i=5; printf("%d\n",sub(i)); } sub(int n) {int a; if(n==1)return 1;
C语言程序设计上机指导与同步训练 3.下面程序的功能是( ,运行结果是( Switch(g 0:r case 1: case2: return 1;1 return fib(g-1)+fib(g-2) printf("k=d\n”,k); 、程序填空 1.下面的函数是一个求阶乘的递归调用函数 facto int n) if(n==1) 2.用递归实现将输入小于32768的整数按逆序输出,如输入12345,则输出54321 in printf("Input n:"); scanf ("sd", &n) (n) rinf( printf("旨a",m10) 三、编程题 1.根据公式 ln≤0 f(b, n= b*f(b, n-1) n>0 设计函数 int f(int b,intn)
·208· C 语言程序设计上机指导与同步训练 ·208· a=n+sub(n-1); return(a); } 3. 下面程序的功能是( ),运行结果是( )。 long fib(int g) {switch(g) {case 0:return 0; case 1:case2:return 1;} return fib(g-1)+fib(g-2); } main() {long k; k=fib(7); printf("k=%d\n",k); } 二、程序填空 1. 下面的函数是一个求阶乘的递归调用函数。 facto ( int n) { if (n==1) ; else return ( ); } 2. 用递归实现将输入小于 32768 的整数按逆序输出,如输入 12345,则输出 54321。 int r(int m); main() { int n; printf("Input n:"); scanf("%d",&n); r(n); printf("\n"); } r ( int m) { printf ("%d",m%10); m= ; if (m>0) r(m); } 三、编程题 1. 根据公式 1 n≤0 b*f(b,n-1) n>0 设计函数 int f(int b,int n);。 f(b,n)=
第二部分¢语言程序设计同步训练 第3讲 知识归纳 1.数组元素作为函数实参 (1)数组元素作函数实参,等价简单变量作实参;形参必须是简单变量。 (2)数组元素作函数实参,实现的就是:传值调用 2.数组名作为函数实参 (1)数组名代表数组的首地址 (2)数组名作函数实参,传递的是数组的首地址一称为传址调用 (3)数组名作函数实参,形参也必须是数组,但形参数组可以指定大小,也可以不指 定大小,因为,C编译系统对形参数组大小不做检查,只是将实参数组的首地址传给形参 数组。 (4)传址调用机制:当函数调用时,传实参数组首地址给形参数组,系统并不给形参 数组分配存储空间,形参数组与实参数组共用存储空间,因此,形参数组中元素的改变, 就是实参数组中元素的改变;传地址调用往往不需要返回值。 基础训练(A) 选择题 1.若用数组名作为函数调用的实参,传递给形参的是()。 A)数组的首地址 B)数组第一个元素的值 C)数组中全部元素的值 D)数组元素的个数 2.若使用一维数组名作函数实参,则以下正确的说法是()。 A)必须在主调函数中说明此数组的大小 B)实参数组类型与形参数组类型可以不匹配 C)在被调函数中,不需要考虑形参数组的大小 D)实参数组名与形参数组名必须一致 3.已有以下数组定义和f函数调用语句,则在f函数的说明中,对形参数组aray的错 误定义方式为() inta[3][4]; f(a); A)f(int array 6]) B)f(int array 3) C)f(int array[[4D) D)f(int array(2I5D) 、填空题 1.实参对形参的数据传送是单向的,即只能把 的值传送给 2.用数组元素作为函数的实参时,与用变量做实参一样,是 传递,即 方 式。其被调函数对调用函数的影响是通过 语句来实现的,只能返回个量值。 3.用数组名作为函数的实参时,不是把数组元素的 传递给形参,而是把实参
第二部分 C 语言程序设计同步训练 ·209· ·209· 第 3 讲 知识归纳 1. 数组元素作为函数实参 (1) 数组元素作函数实参,等价简单变量作实参;形参必须是简单变量。 (2) 数组元素作函数实参,实现的就是:传值调用。 2. 数组名作为函数实参 (1) 数组名代表数组的首地址。 (2) 数组名作函数实参,传递的是数组的首地址—称为传址调用。 (3) 数组名作函数实参,形参也必须是数组,但形参数组可以指定大小,也可以不指 定大小,因为,C 编译系统对形参数组大小不做检查,只是将实参数组的首地址传给形参 数组。 (4) 传址调用机制:当函数调用时,传实参数组首地址给形参数组,系统并不给形参 数组分配存储空间,形参数组与实参数组共用存储空间,因此,形参数组中元素的改变, 就是实参数组中元素的改变;传地址调用往往不需要返回值。 基础训练(A) 一、选择题 1. 若用数组名作为函数调用的实参,传递给形参的是( )。 A) 数组的首地址 B) 数组第一个元素的值 C) 数组中全部元素的值 D) 数组元素的个数 2. 若使用一维数组名作函数实参,则以下正确的说法是( )。 A) 必须在主调函数中说明此数组的大小 B) 实参数组类型与形参数组类型可以不匹配 C) 在被调函数中,不需要考虑形参数组的大小 D) 实参数组名与形参数组名必须一致 3. 已有以下数组定义和 f 函数调用语句,则在 f 函数的说明中,对形参数组 array 的错 误定义方式为( )。 int a[3][4]; f(a); A) f(int array[][6]) B) f(int array[3][]) C) f(int array[][4]) D) f(int array[2][5]) 二、填空题 1. 实参对形参的数据传送是单向的,即只能把 的值传送给 。 2. 用数组元素作为函数的实参时,与用变量做实参一样,是 传递,即 方 式。其被调函数对调用函数的影响是通过 语句来实现的,只能返回 个量值。 3. 用数组名作为函数的实参时,不是把数组元素的 传递给形参,而是把实参
·210 C语言程序设计上机指导与同步训练 数组的 传递给形参数组,是 传递,即 方式,这样两个数组就共占 同一段内存单元。 4.用多维数组名作为实参和形参时,可以省略的大小说明,而不能把第二维以 及其他高维的大小省略。 、编程题 设计函数 void selsort( int data[ Int size),它用选择法将数组data中的数据排列为升序。 参数size是数组data的元素个数。 能力提高(B) 、分析程序 1.已知函数swap(intx,inty)可完成对x和y值的交换。执行下面的程序。 int x, int y) t=x, x=y; y=ti main() inta[]={1,2} swap(a[0],a[11); printf(”号d,告dln",a[0],a[1]) a[0和a[值分别为( ),原因是 2.函数swap(ar,n)可完成对ar数组从第一个元素到第n个元素两两交换。在运行调 用函数中的如下语句后,a和a[值分别为(),原因是() 3.写出以下程序的运行结果( ),其算法是( int sort (int a[]) main() inta[5]={5,10,-7,3,7},I,t,j; sort(a)i for(I=0: Ia[j+1])(t=a[j]; a[j]=a[j+]; a[j+1]t y 4.阅读下面程序,完成下列问题中的填空 问题:此程序在调用函数f后的运行结果是( f(int s[][4] int工,j,k
·210· C 语言程序设计上机指导与同步训练 ·210· 数组的 传递给形参数组,是 传递,即 方式,这样两个数组就共占 同一段内存单元。 4. 用多维数组名作为实参和形参时,可以省略 的大小说明,而不能把第二维以 及其他高维的大小省略。 三、编程题 设计函数 void selsort (int data[],int size);,它用选择法将数组 data 中的数据排列为升序。 参数 size 是数组 data 的元素个数。 能力提高(B) 一、分析程序 1. 已知函数 swap(int x,int y)可完成对 x 和 y 值的交换。执行下面的程序。 swap(int x,int y) { int t; t=x; x=y; y=t; } main() { int a[]={1,2}; swap(a[0],a[1]); printf(“%d,%d\n”,a[0],a[1]); } a[0]和 a[1]值分别为( ),原因是( )。 2. 函数 swap(arr,n)可完成对 arr 数组从第一个元素到第 n 个元素两两交换。在运行调 用函数中的如下语句后,a[0]和 a[1]值分别为( ),原因是( )。 a[0]=1;a[1]=2; swap(a,2); 3. 写出以下程序的运行结果( ),其算法是( )。 int sort (int a[]); main() {int a[5]={5,10,-7,3,7},I ,t,j; sort(a); for(I=0;Ia[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;} } 4. 阅读下面程序,完成下列问题中的填空。 问题:此程序在调用函数 f 后的运行结果是( )。 f(int s[ ][4]) {int I,j,k;