前言
上一篇文章中,我们讲述了C语言中函数的基本概念,在这篇文章中,我们来讲述一下函数后续的内容。
自定义函数
在代码程序编写中,相较于库函数而言,程序员自己编写的自定义函数的应用范围尤其广泛,所以,我们也应该更加关注。
函数的语法形式
其实,C语言中库函数和自定义函数基本相似,自定义函数的语法格式如下:
ret_type fun_name(形式参数)
{
}
ret_type:是函数的返回类型;
fun_name:函数名;
括号里面是形式参数;
{}里面是函数体;
我们可以把函数想象成为一个小型的加工厂,工厂需要输入原材料,并且经过工厂加工才会输出成品,那函数也是一样,函数需要输入一些数字,经过函数的计算,最后输出结果。
ret_type:是函数的返回类型;也可以是void,表示什么都不返回。
fun_name:函数名;为了方便使用,应该根据自定义函数的功能取得有特点一些,这样子便于记忆。
函数的参数就相当于送进去的原材料,函数的参数也可以有0个,也可以有多个,也可以是void,表示没有参数,要是有参数的话,需要说明参数的类型,名称和个数。
{}括起来的部分就是函数体,表明函数计算的整个过程。
函数的举例
举一个加法函数的例子,看下面的代码块:
#include<stdio.h>
int main()
{
int a;
int b;
int r;
scanf("%d %d", &a, &b);
r = a + b;
printf("%d", r);
return 0;
}
我们创造一个函数Add,这个函数就是自定义函数,执行两个函数的加法功能:
#include<stdio.h>
int add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int r = add(a, b);
printf("%d\n", r);return 0;
}
add函数也可以简化为:
#include<stdio.h>
int add(int x, int y)
{
return x + y;
}
函数的参数部分要交代清楚,每个参数的类型和个数,形参的名称;
形参和实参
在函数的使用部分中,我们将参数分为形参和实参:
再看一次我们上面所写的代码:
#include<stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d %d", &a, &b);int sum = add(a, b);
printf("%d\n", sum);
return 0;
}
实参
在上面的代码中,最上面是函数add的定义,有了函数之后,int后面是对add函数的调用,我们在调用add函数的时候,涉及到的参数a和b,这就是实参,实参就是真是传递给函数的参数,
形参
在上面的代码中,add后面的括号中的x和y就是形式参数,简称形参
什么叫形式参数呢,就是如果只是定义了add函数,而不去调用的话,那么x和y是不会向内存申请占用空间的,不会占用真实空间,所以叫做形式参数,如果add函数被调用的时候,x和y为了存放实际参数传送过来的值,从而向内存申请占用空间,这个过程叫做形式参数的实例化。
形参和实参的关系
虽然我们提到了实参将数据送到形参,他们之间是有联系的,但是实参和形参所占用的空间是不同的,这个,我们可以通过调试代码可以看到。
#include<stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d %d", &a, &b);int sum = add(a, b);
printf("%d\n", sum);
return 0;
}
x86表示32位环境-编译生成32位的程序
x64表示64位环境-编译生成64位的程序
我们在调试过程中可以明确看到,x和y确实是得到了a和b的值,但是,x和y的地址和a和b的地址却并不相同,我们可以理解为形参是实参的一份临时拷贝。
return语句
在使用函数的过程,我们经常会使用到return 语句,这里,我们讲一下return 语句使用的注意事项。
1.return语句后面可能是一个数值,也可能是一个表达式,如果是一个表达式的话,就先执行表达式,返回表达式的结果。
2.return 后面也可以什么都不写,直接表示为return;,这种适用于返回类型为void类型的函数
3.return 返回的值和函数返回的值得类型不一样,系统将隐式转化为函数返回的值的类型。
4.return语句执行后,将会彻底返回,后续的代码不在执行。
5.如果函数中存在if等分支的语句,则要确保每种情况下都有return返回,否则将会出现编译错误。