(一)函数调用的形式
函数调用的一般形式为:
函数名(实际参数列表)
1.若调用无参函数,实际参数列表(简称实参)为空;调用有参函数时,在()内写出实参,
当有多个实参时,用[英]逗号隔开,且实参与形参的类型、数量需一致。
2.若函数无返回值,函数调用通常单独作为一个语句;
若函数有返回值,函数调用通常出现在表达式中,或者作为某个函数的实参。
(二)函数调用过程中的参数传递
对于有参函数,函数调用过程中参数传递有两种情况,分别为数值传递、地址传递。
1.数值传递:实参传递给形参的数据是数值,实参和形参在内存中占用不同的存储单元,参数传递完后,形参与实参就无关了,即使形参发生变化也不会影响实参。实参数值传递到形参后,自定义函数执行,然后将结果通过return 语句返回到主函数中,自定义函数调用结束。
2.地址传递:实参通过数组名给形参传递地址数据,参数传递时,把实参数组的首地址传递给形参数组,此时两个数组共占用同段内存单元,因此形参与实参就密切相关,形参数组中各元素的值如果发生变化,会使实参数组元素的值同时发生变化。自定义函数的执行结果也是通过return 语句返回到主函数中。
//自定义函数调用过程的数值传递演示
#include<stdio.h>
int max(int x, int y) //假设得到的数值是"x = 6","y = 8"
{
int z; //函数体开始执行
z = x > y ? x : y;//执行过程:6 > 8 的值为假,把"表达式3"作为该条件表达式的值,即把8赋值给z
return z; //通过return 语句把值z = 8返回到主函数中。
}
int main()
{
int a, x, y;
printf("请输入两个整数:");
scanf_s("%d%d", &x, &y);
a = max(x, y); //自定义函数引用
//把从scanf_s得来的实参"x值"和"y值"传递给形参(int x, int y)
printf("最大值:%d", a); //自定义函数调用结束,
//把其得到的值z = 8赋值给a,并通过printf函数输出
return 0;
}
//自定义函数调用过程的地址传递演示
#include<stdio.h>
int string_len(char str[]); //自定义函数的声明
int main()
{
int a;
char s[100];
printf("请输入一个字符长度小于100的字符串:\n");
gets_s(s, 100);
a = string_len(s); //自定义函数的引用
//把从gets_s得来的实参数组s的首地址"s[]"传递给形参(char str[])
printf("该字符串的长度为:%d", a);
//自定义函数调用结束,把其得到的 i 值赋值给a,并通过printf函数输出
return 0;
}
int string_len(char str[]) //首地址传递后,此时形参和实参占用共同地址,str[] == s[]
{
int i = 0; //函数体开始执行
while (str[i] != '\0') //执行过程:当元素str[i]不等于字符串结束标志符'\0'时,执行while 循环
{
i++; //循环计数器i每轮循环自加1,直到循环控制语句为假,即遇到'\0'
}
return i; //通过return 语句把 i 值返回到主函数中。
}