按值调用和引用调用

上一节,我们根据函数的参数和返回值将函数分为了不同的类型。这一节,我们来讨论函数的调用方式。根据传入的参数,函数的调用方式可以分为以下两种类型:

  1. 按值调用函数
  2. 引用调用函数

每一个初始化了的变量都会存放在内存地址里面。按值调用函数传入参数的是变量名或者值,而引用调用函数传入的参数是地址。

按值调用函数

在“按值调用”函数中,输入参数是变量或某些常量。

语法:

function_Name(input1,input2);

例如:

1. func1(2,3);    /*输入参数是整型常量*/
2. func2(x,y);    /*输入参数是存储常量的整型变量*/

程序

#include<stdio.h>

/*函数原型声明*/
int addition(int ,int );

int main()
{
    int num1;
    int num2;
    int sum;

    printf("程序功能是对两个整数进行求和。");

    printf("\nEnter Num1 :");
    scanf("%d",&num1);

    printf("\nEnter Num2 :");
    scanf("%d",&num2);

    sum = addition(num1,num2);  /*函数按值调用*/

    printf("sum=%u",sum);

    return 0;
}

/*函数定义*/
int addition(int num1_copy,int num2_copy)
{
    unsigned int sum;

    sum=num1_copy+num2_copy;

    return sum;
}

按值调用函数如何工作

如下所示,为函数按值调用的流程图。
按值调用函数

注意:

  1. 函数在调用前,必须声明函数;
  2. 按值调用函数不操作实际的输入参数(num1,num2),而是操作它们的副本(num1_copy,num2_copy)
  3. C语言中,main函数是所有程序的入口和出口。因此我们可以在main函数中调用所有自定义的函数,但程序指针将返回到调用函数的语句处。因为程序的出口仅有main函数。

引用调用函数(地址)

在引用调用函数中,输入参数应为函数调用中变量或常量的地址。

要理解引用调用函数的工作原理,你必须先熟悉指针概念。关于指针的用法,请参考上一节内容:C指针

语法:

function_Name(&input1,&input2);

例如:

1. func1(&2,&3);    /*输入参数地址*/
2. func2(&x,&y);    /*输入参数地址*/

程序:

#include<stdio.h>

int addition(int *,int *); /*函数原型声明*/

int main()
{
    int num1;
    int num2;
    int sum;

    printf("程序功能是对两个整数进行求和。");

    printf("\nEnter Num1 :");
    scanf("%d",&num1);

    printf("\nEnter Num2 :");
    scanf("%d",&num2);

    sum = addition(&num1,&num2);  /*引用调用函数*/

    printf("sum=%u",sum);

    return 0;
}

/*函数定义*/
int addition(int *num1_Addr,int *num2_Addr)
{
  int sum;

  sum=*num1_Addr + *num2_Addr;

  return sum;
}

按值调用函数如何工作

如下所示,为函数引用调用的流程图。
引用调用函数

下一节