既可以按值调用,也可以通过参考工作调用?

时间:2017-03-10 08:47:54

标签: c pass-by-reference call-by-value

我认为按值调用函数永远不会工作,我应该总是使用引用调用,但是尝试这段代码......

// call by value 
#include<stdio.h>

int Add(int a, int b)
{
    int c = a + b ;
    return c ; 
}

int main()
{
    int x = 2 , y = 4 ;
    int z = Add(x,y);
    printf("%d\n",z); 
}

输出将是:6

它在两种方式下都能正常工作(按值调用和按引用调用),

// call by reference
#include<stdio.h>

int Add(int* a, int* b)
{
    int c = *a + *b ;
    return c ; 
}

int main()
{
    int x = 2 , y = 4 ;
    int z = Add(&x,&y);
    printf("%d\n",z); 
}

output will be: 6

不像着名的交换函数示例 - 按值调用时它不会交换 -

// call by value
#include <stdio.h>

void swap(int a, int b)
{
   int temp;

   temp = b;
   b   =  a;
   a   = temp;   
}

int main()
{
   int x = 1 , y = 2;

   printf("x = %d , y = %d\n", x,y); 

   swap(x, y); 

   printf("after swapping\n"); 
   printf("x = %d , y = %d\n", x,y); 

   return 0;
}

..它仅通过引用进行调用

// call by reference
#include <stdio.h>

void swap(int *a, int *b)
{
   int temp;

   temp = *b;
   *b   = *a;
   *a   = temp;   
}

int main()
{
   int x = 1 , y = 2;

   printf("x = %d , y = %d\n", x,y); 

   swap(&x, &y); 

   printf("after swapping\n"); 
   printf("x = %d , y = %d\n", x,y); 

   return 0;
}

那么如何判断&#34;按值调用&#34;去上班还是不去?

1 个答案:

答案 0 :(得分:-1)

  

那么如何判断值调用方法是否有效?!

嗯,这取决于你的功能将要做什么。

在上面的示例中,您只需需要(x,y)的值进行计算,但您从未计划在函数期间更改其值。虽然在这种情况下,引用调用将起作用,但它是不必要的。

在另一个(间接给定的)示例中,您显然希望更改两个变量的内容(即 - 交换它)。您可以从交换函数中的main函数访问这些变量,但是如何使更改持久化?这只能通过引用调用来实现,因为你必须将更改的内容写入一个能够在函数中存活的变量。

以下内容不起作用:

// call by value 
#include<stdio.h>

void Swap(int a, int b)
{
    int c = a;
    a = b;
    b = c;
    // from here on a, b, c will be destroyed
    // therefore the change cannot be seen outside the function
}

int main()
{
    int x = 2 , y = 4 ;
    Swap(x,y);
    printf("x: %d --- y: %d\n",x,y); 
}

因此,请记住:

如果你想进行一个应该在函数结束时存活的更改,请使用call-by-reference。如果您只是使用某些数据但不想(或必须)更改其值,请使用按值调用。