一.函数的嵌套调用
1.定义一个函数(非主函数),返回三个整数的最大值,并在主函数中输出。(函数的参数个数,根据自己的需要设定)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int max(int x, int y);
int main() {
int num1=0, num2=0, num3=0;
scanf("%d %d %d", &num1, &num2, &num3);
printf("%d", max(max(num1, num2), num3));//因为巧妙利用函数的嵌套调用,所以只要传递两个参数。
}
int max(int x, int y) {
if(x>=y)
{
return x;
}
else {
return y;
}
}
2.利用递归方法求5!阶乘。函数体中有直接或者间接调用自身函数的情况。
int fun(int n) {
if (n == 1||n==0) {//记得考虑全面,0和1的阶乘是1
return 1;
}
else {
int m = n * fun(n - 1);//利用函数的嵌套
return m;
}
}
int main() {
int num = 5;
int y=fun(num);
printf("%d", y);
}
二. 函数的传参
1.如有以下程序:
#include<stdio.h>
void fun(int x, int y)
{
x++;
y++;
}
void main()
{
int x = 1, y = 2;
fun(x, y);
printf("x=%d,y=%d\n", x, y);
}
程序运行后的输出结果为( ) 。
-
A. x=1,y=2 【正确答案】
B. 1,2
C. x=2,y=3
D. 2,3
答案解析:
本题考察的是函数调用的执行流程,以及函数参数的传递。
注意:(1)函数名表示函数的首地址。
(2)实参值传递给形参,是把实参值拷贝一份给形参。
(3)主函数体范围内定义的变量x、y只能在主函数体范围内使用,出了作用范围就失效。所以fun函数中的变量x、y与主函数的x、y是不同的变量。相当各自家的孩子名字一样,但不是同一个孩子。
计算机执行流程:
(1)计算机从主函数开始执行,在主函数中定义 x 、 y 两个整型变量,分别得到初值1、2。接着往下执行代码,调用fun函数。
(2)fun函数对应有两个实参 x 、y,函数调用过程把实参的值传给形参。fun函数的形参x,y接收了主函数中局部变量的值,x++、y++是fun函数的变量变化,与主函数的x、y无关。fun函数中的代码执行完毕,函数调用结束。
(3)fun函数调用结束,回到主函数执行完调用fun函数之后,输出主函数中x、y的值:x=1,y=2。
所以答案选择A选项。
2.以下程序的运行结果是 。
void sub(int x, int y);
int x1 = 30, x2 = 40;
int main()
{
int x3 = 10, x4 = 20;
sub(x3, x4);
sub(x2, x1);
printf("%d,%d,%d,%d\n", x3, x4, x1, x2);
return 0;
}
void sub(int x, int y)
{
x1 = x;
x = y;
y = x1;
}
答案解析:
本题考察全局变量与局部变量。
注意:
(1)局部变量:在函数内定义的变量,包括形参。作用范围:所在的作用域内(通常是所在的花括号内)。
(2)全局变量:在函数外定义的变量。作用范围:所在文件中定义全局变量开始往下的范围。
代码执行流程:
(1)在程序被执行时,全局变量获得内存。
(2)计算机执行程序从主函数开始执行,接着定义局部变量x3、x4;
(3)第一次调用sub函数,把实型x3和x4的值拷贝给sub函数的x、y形参,执行sub函数中的代码块。把x的值赋值给x1,该x1是全局变量,所以x1的值被改变(x1=10);把y的值赋值给x(x=20);把x1的值赋值给y(y=10)。调用完sub函数,sub函数的形参x和y也跟着被释放。
(4)接着,第二次调用sub函数。把实型x2和x1的值拷贝给sub函数的x、y形参,执行sub函数中的代码块。把x的值赋值给x1,该x1是全局变量,所以x1的值被改变(x1=40);把y的值赋值给x(x=30);把x1的值赋值给y(y=40)。调用完sub函数,sub函数的形参x和y也跟着被释放。
(5)输出x3、x4、x1、x2的值。分别是10 20 40 40
三.字符串拷贝函数
下面程序段的运行结果是( ) 。
char s[80],sp[ ] = "HELLO!";
strcpy(&s[1], sp);
s[0] = 'h';
puts(s);
A. HELLO!
B. hHELLO! 【正确答案】
C. HELLOc!
D. hELLO!
答案解析:
考察的点是:字符串拷贝函数。
(1)"HELLO!"保存到以&s[1]为首地址处,其中s[0]元素是没有得到值。
(2)把字符 'h' 赋值给s[0]元素。
(3)输出s中保存的字符串: "hHELLO!"
答案选择B选项。