C语言函数调用和参数传递

C语言函数被定义以后可以被多次调用,调用的时候可以向它传递参数。

C语言函数调用

函数的调用指的就是函数的使用方法。

在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下:
函数名(实参1, 实参2,  …)    //实参对应于函数定义时的形参声明

程序执行时,函数调用表达式将会被函数返回值所代替(见图 1)。函数的返回值一般由 return 语句指定。

函数调用时参数的传递(值传递)和值的返回
图 1:函数调用时参数的传递(值传递)和值的返回

程序运行中进行函数调用后,程序的流程会转到被调用的函数处,同时传递过来的实参的值被赋值给函数对应的形参(形参初始化),接着执行函数体语句,在遇到 return 语句,或者执行到函数体最后的大括号时,程序流程就会从该函数跳转到原来调用函数的位置(见图 2)。

调用函数时程序的执行流程
图 2:调用函数时程序的执行流程

代码清单 1:使用函数求两个整数中较大的值
#include <stdio.h>
#include <stdlib.h>

/*---自定义函数Max2:返回较大值---*/
int Max2 (int a, int b)
{
    if(a>b)
        return a;
    else
        return b;
}

/*---主函数---*/
int main( )
{
    int n1,n2;
    puts("请输入两个整数。\n");
    printf("整数1:");  scanf("%d",&n1);
    printf("整数2:");  scanf("%d",&n2);
    printf("较大的值是%d \n",Max2(n1,n2));  //调用Max2函数
    system("pause");
    return 0;
}

运行结果为:

请输入两个整数。

整数1:66
整数2:47
较大的值是66

知识点总结

  • 函数调用的形式是在函数名后面加上小括号“()”。
  • 函数调用时,小括号“()”中的参数称为“实参”。
  • 函数调用的形式可称为“函数的调用表达式”。
  • 函数调用表达式的值就是函数的返回值。

函数调用时参数的传递:值传递

上面的代码清单 1 中,main( ) 函数通过 Max2(n1,n2) 调用自定义函数 Max2 时,实参变量 n1 的值被赋值给 Max2 的形参变量 a,实参变量 n2 的值被赋值给 Max2 的形参变量 b,此时,a 是 n1 的副本,两者具有相同的值,b 是 n2 的副本,两者具有相同的值。像这样通过值来进行参数传递的机制称为值传递

由于函数间参数的传递是通过值传递进行的,所以,函数调用表达式中的实参可以是另一个有返回值的函数调用表达式(见图 3)。

将函数的返回值作为参数传递给函数
图 3:将函数的返回值作为参数传递给函数

知识点总结

  • 函数间参数的传递是通过值的传递进行的。
  • 函数调用时实参的值会被赋给形参。
  • 形参所指的变量是对应的实参所指的变量的副本,它们具有相同的值。

3. 函数调用时数组的传递

自定义函数中,如果形参接收的是一个数组,则定义函数时要在形参声明中加上[ ]。而在函数调用表达式中的实参则直接使用数组名即可(见图 4)。

指向数组的形参声明格式如下:
类型名 形参名[ ]             //形参名与指向的原数组名不同
                           //类型名与数组的数据类型相同

函数调用中数组和变量值的传递
图 4:函数调用中数组和变量值的传递

代码清单 2:使用函数(数组的传递)计算数学成绩和英语成绩的最高分
#include <stdio.h>
#include <stdlib.h>
#define NUMBER 5

/*--自定义函数:返回拥有n个元素的数组v中的最大值--*/
int Max_of(int v[],int n)
{
int i,max=0;
for(i=0;i<n;i++)
  if(v[i]>max) max=v[i];
    return max;
}

/*---主函数---*/
int main()
{
    system("color 70");
    int i,eng[NUMBER],math[NUMBER],max_e,max_m;
    printf("请输入%d名学生的成绩。\n",NUMBER);
    for(i=0;i<NUMBER;i++){
        printf("[%d]英语:",i+1);  scanf("%d",&eng[i]);
        printf("   数学:");       scanf("%d",&math[i]);
    }
    max_e=Max_of(eng,NUMBER);         //调用Max_of函数
    max_m=Max_of(math,NUMBER);        //调用Max_of函数
    printf("英语最高分=%d\n",max_e);
    printf("数学最高分=%d\n",max_m);
    system("pause");
    return 0;
}

运行结果为:

请输入5名学生的成绩。
[1]英语:89
   数学:78
[2]英语:77
   数学:88
[3]英语:79
   数学:83
[4]英语:71
   数学:87
[5]英语:70
   数学:96
英语最高分=89
数学最高分=96


图 5 展示了函数调用中数组的传递和变量值传递的区别。


图 5:函数调用中数组的传递和变量值传递的区别

知识点总结

  • 函数内接收数组的形参所指的数组就是原数组本身,只是数组名改变为形参的参数名而已(有别于一般变量参数值的传递)。
  • 在函数内对形参数组的修改实际上就是对实参数组(原数组)的修改。
  • 在函数内改变形参变量的值不会影响实参变量。