上一节介绍了如何自己制作积木——定义自己的函数,并且给出了例子。应该能记得,上一节中自定义的函数既没有返回值,也没有参数,但是实际应用中,要解决复杂的问题,函数应该能够根据外界的输入做出相应的变化。例如,我们需要打印出 4+6 的值,函数可以如下定义:
void add()
{
printf("4+6=%d\n", 4+6);
}
的确,add 函数能够打印出 4+6 的值,解决了问题。但是,可能还会有类似,但不相同的问题出现,比如需要打印出 3+4 的值,这时上面定义的 add 函数就没有办法解决问题了,只能重新定义一个函数。这非常麻烦。事实上,C 语言中的函数可以接收外界传入的数据,我们如下修改 add 函数:
void add(int a, int b)
{
printf("%d+%d=%d\n", a, b, a+b);
}
这样,add 函数解决的就不是一个问题了,而是一类问题,打印 4+6 的值只需调用 add(4, 6),打印出 3+4 的值,只需调用 add(3, 4)。
形参和实参
在之前一节,我们介绍了全局变量和局部变量,知道了函数的参数也属于局部变量。在 C 语言中,函数的参数分为“形参”和“实参”,以上面定义的 add 函数为例,我们调用 add(4, 6) 时,函数中的参数 a 就代表 4,b 就代表 6。确切的说,当我们讨论函数中的 a 这个参数时,我们所说的“参数”是指“形参”,当我们讨论传一个参数 4 给函数时,我们所说的“参数”是指“实参”。
但是我习惯都叫参数而不习惯总把形参、实参这两个文绉绉的词挂在嘴边儿(事实上大多数人都不习惯),可根据上下文判断指的到底是形参还是实参。记住这条基本原理:形参相当于函数中定义的变量,调用函数传递参数的过程相当于定义形参变量并且用实参的值来初始化。
int main()
{
int p1 = 4, p2 = 6;
add(p1, p2);
return 0;
}
上面在 main 中调用了 add 函数,就相当于在 add 函数中执行了如下语句:
int a = p1;
int b = p2;
printf("%d+%d=%d\n", a, b, a+b);
main 函数的变量 p1 和 add 函数的参数 a 是两个不同的变量,只不过它们各自的存储空间中存了相同的值 4,因为变量 p1 的值赋给了参数 a。同理,变量 p2 的值赋给了参数 b。C语言中在调用函数时,每个参数都需要得到一个值,函数定义中有几个参数,在调用中就需要传几个参数,不能多也不能少,每个参数的类型也必须对应上。
事实上,C 语言中也定义了一些参数不定的函数,比如 printf,它可以接收 1 个或多个参数。以后遇到需要定义这样的函数时,再详细介绍。
易错点
请看如下代码:
void add(int a)
{
a=a+1;
}
int main()
{
int p = 2;
add(p);
printf("p=%d\n", p);
return 0;
}
该程序员原计划让 add 函数实现参数 p 加一,但是却失败了,以上代码输出的是 p=2。这是因为 add 函数中的参数 a 和 main 函数中的 p 根本就是两个变量。add 函数在执行完毕后,它所在的内存就被收回了。关于这一点,《》一节说的非常清楚,可以再回顾一下。
上一节,我们把自定义函数比作自己做积木,那自定义带参数的函数,就相当于制作可以变形的积木,更加灵活,所以能够完成更多工作。
关于这一点,《》一节说的非常清楚 ,
好几篇都出现 上面这句 每次看到我都很凌乱233
这个是编辑时偷了个懒,打算写完补上的,结果忘了。。。下次要仔细校验咯,