一、基本概念
- 函数就是用来实现某个功能的程序段,每个函数都有自己的功能。
- 一个C程序中可能会有很多的函数。为了方便调用和区分这些函数,需要为每一函数都起一个唯一的名称,函数的命名必须按照标识符命名规则。利用调用函数名可以调用到对应的函数。
三、定义
1.任何一个函数在使用之前都必须进行定义
返回值类型 函数名(形式参数列表)
{
函数体
}
2.举例
比如定义一个函数用来计算两个整数的和。那么可以写成下面这样:
#include <stdio.h>
int sum(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int d = sum(10, 11);
printf("d is %d", d);
return 0;
}
- 分别在第3行、第9行定义了sum函数、main函数,其中sum函数的作用是计算两个整数的和。
- 函数定义好后,并不会马上执行函数内部的代码,要有人调用它才会执行内部的代码。就好像你的手机虽然有打电话的功能,但是只有按了拨号键,才会执行打电话的功能。
- 程序运行时就会先调用main函数,按顺序执行第11~14行代码,因为main函数是程序的入口
- 第11行的sum(10, 11)是调用sum函数,sum函数被调用了,就会分配存储空间给形式参数列表中的所有参数,也就是第3行中的变量a和变量b,它们都是“形式参数”
- 第11行中的10、11称为“实际参数”,它们将分别赋值给变量a、变量b,也就是相当于
int a = 10;
int b = 11;
- 既然调用了sum函数,就会按顺序执行sum函数中的代码,也就是5~6行代码。
- 第5行将a+b的值21赋值给了变量c,第6行使用return关键字将变量c返回给了函数调用者,也是说,第11行sum(10, 11)的值是21。那么变量d的值就是21。
- 第13行的输出结果为
is 21
- 第3~7行中的变量a、b、c都只有在调用sum函数时,才会分配存储空间,当sum函数执行完毕后,变量a、b、c就会被释放存储空间。因此,它们的作用域仅限于sum函数内部。
- 第3行sum左边的int称为“返回值类型”,第6行return关键字后面跟着的数值称为“返回值”,因此第6行的变量c就是返回值,返回值的数据类型应该跟“返回值类型”保持一致。
三、形式参数和实际参数
1.基本概念
1>形式参数:在定义函数时,函数名后面的小括号()中定义的变量称为形式参数,简称形参 |
2> 实际参数:在调用函数时传入的值称为实际参数,简称实参 。。。。。。。。。。。。。。 |
int sum(int a, int b, int c)
{
return a + b + c;
}
int main()
{
sum(10, 9, 7);
return 0;
}
第1行中sum函数中有3个形参,因此在第8行调用sum函数时,需要传入3个实参
- 当使用基本数据类型(char、int 、float等)作为实参时,实参和形参之间只能是值传递,修改形参的值并不影响到实参
#include <stdio.h>
int test(char a)
{
a = 10;
return 0;
}
int main()
{
char b = 5;
test(b);
printf("b的值是%d", b);
return 0;
}
- 在第3行定义了test函数,只有一个形参a
- 在第14行调用了test函数,接着就会分配内存给变量a。这里将变量b当做实参,那么变量b的值将传递给变量a。这个时候,内存中大致如下图所示:
(其实在内存中存储的是二进制数据,这里我写成10进制是为了直观性) - 执行完第5行代码后,变量a的值变成了10,但是变量b的值依然是5
- 第16行代码的输出结果是:
b的值是5
因此,在函数内部修改了形参的值,并不会影响到外面的实参。
4.函数可以没有形参
定义一个函数时可以是没有形参的,比如下面的函数
#include <stdio.h>
int test()
{
printf("调用了test函数");
return 0;
}
int main()
{
test();
return 0;
}
- 在第3行定义了test函数,可以发现,它的
- 形参列表是空的,也就是没有形参
那么在第11行调用test函数时,就不用传递任何实参 - 其实,第9行定义的main函数也是没有形参的
四、返回值类型
- 返回值就是函数调用完后,返回给函数调用者的结果,用return关键字进行返回。定义函数时,要指明函数返回值类型
- 一个函数可以没有返回值,如果没有返回值,应该用void表示返回值类型
- 如果一个函数没有返回值,最后面的return语句可以省略
- 如果一个函数没有明确写出返回值类型,那么代表这个函数的返回值类型的时int
五、return
- return 语句可以在函数内部返回一个值给函数调用者
- 一个函数内部可以多次使用return 语句后,函数就会马上停止执行,return语句后面的代码就不再执行
六、函数的定义注意
- 函数名不能重复
- 每个函数都应该独立定义,不能嵌套定义
七、补充
- 在标准C语言中,函数的定义顺序是有讲究的,默认情况下,只有后面定义的函数才可以调用前面定义过的函数
- 如果想把其他函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数前面作一下函数的声明
详细请看:
https://mjios.cnblogs.com/archive/2013/06/08/3082932.html#toc_title_0
https://www.cnblogs.com/mjios/archive/2013/03/13/2957628.html
https://mjios.cnblogs.com/archive/2013/06/08/3093954.html#label0