在此前,我们写的程序都只有一个主函数(main函数)
但是当一个程序的功能非常多的时候,主函数就会十分的冗杂。
这个时候我们可以把一个能实现一个小的功能的一段代码划分到一个的函数中,在需要实现这个功能时调用这个函数。
我们可以将不同功能的代码段划分到不同的函数中。就可以简化函数,并且使得程序结构化。就像之前对字符串的操作函数一样。
函数的定义
/*函数类型 函数名(参数变量类型 参数名)//参数可以没有,也可以是多个的
{
函数体
}*/
//如:
int max(int x,int y)
{
int max;
max=x;
if(x<y)
max=y;
return max;
}
- 返回值:一个函数可以返回一个值。在此例中
return max;
max的值就是返回值。 - 函数类型:函数类型实际上是返回值的类型。当函数类型是void类型时,函数不用返回一个值。
- 参数:当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
通常我们把main函数称为主函数,其他函数成为子函数
调用函数
直接上代码吧:
int max(int x,int y)
{
int max;
max=x;
if(x<y)
max=y;
return max;
}
int main()
{
int a,b;
scanf("%d%d",a,b)
printf("%d",max(a,b));//函数的返回值就是max(a,b)
return 0;
}
函数在调用时没有什么限制,唯一的限制就是其他函数不能调用main函数。
也就是可以有一下的调用方法:
主函数可以调用子函数,子函数中可以调用其他子函数,甚至可以调用自己
子函数自己调用自己被称之为递归。
函数调用时的值传递
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 5;
int b = 10;
swap(a, b); //调用交换函数
printf("交换结果为 a = %d, b = %d\n",a,b);
return 0;
}
运行结果:
交换结果为 a = 5, b = 10
当主函数调用swap函数时,只是将a和b的值给了x和y,而不是让a成为x,b成为y。所以在交换完成后,交换的是x好y的值,而a和b并没有改变。
也就是说在调用时:
执行了一步赋值的操作x=a;y=b;
函数的实参和形参
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 5;
int b = 10;
swap(a, b); //调用交换函数
printf("交换结果为 a = %d, b = %d\n",a,b);
return 0;
}
主函数中swap函数在调用时a和b被称为实参,x和y被称为形参。
实参可以被理解为真实的,而形参可以被理解为“虚的”,但无论是形参还是实参都占了实际的内存。
局部变量和全局变量
一个程序,例如
int n;
void fn1()
{
int x;
int y;
……
}
int m;
int fn2()
{
int i;
int j;
……
}
int main()
{
int a;
int b;
……
}
n和m在函数外部,它们就是全局变量:
对于n而言fn1函数和fn2函数和main函数均可以使用它。
但是m只有fn2函数和main函数可以使用,fn1则不行。
变量的作用范围是从定义位置开始的。
a,b;x,y;i,j;z则是局部变量
只能在它们所在的函数中使用。
函数的声明和定义
先看代码(借用上面的例子):
#include<stdio.h>
void swap(int x, int y);//声明
int main()
{
int a = 5;
int b = 10;
swap(a, b); //调用交换函数
printf("交换结果为 a = %d, b = %d\n",a,b);
return 0;
}
void swap(int x, int y)//定义
{
int temp;
temp = x;
x = y;
y = temp;
}
声明只是告诉编译器有这样一个函数,具体的代码不写,但要加上;
。
而定义就是要写出函数的函数体。
当定义写在main函数之后时则需要在main函数之前加上声明。
当定义在main函数之前时则不用写声明。
递归
上面说过了,函数自己调用自己就是递归。
这里用递归来实现阶乘
int fn(int n)
{
if(n=0)
return 1;
else
return n*fn(n-1);
}
int main()
{
int n=5;
printf("%d!=%d",n,fn(n));
return0;
}
运行结果:
5!=120
首先,这题我们要先明白递归的概念,递归指的是一个函数自己调用自己,首先我们知道主函数main只能有一个也不可能被其他函数调用,所以我们肯定要写一个子函数,然后再子函数里用递归。然后我们去找递归的结束标志,如果没有结束标志,那么这个递归程序会一直调用自己,导致你的程序崩溃,所以去找递归的结束标志很重要。很明显,当n的值等于1的时候,我们就不用再调用自己了,然后返回到上一层,乘上这一层的n,然后再一层一层返回,每返回一层,n的值就比返回的n大1,直到返回到第一层的时候,就是我们的第一个乘数。这样我们就模拟出了阶乘的算法,然后再返回给主函数打印。