c - 按值调用和按引用调用都有效吗?

标签 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;
}

那么我如何判断“按值调用”是否有效?!

最佳答案

So How can I judge that call by value method is valid or not ?!

嗯,这取决于你的函数要做什么。

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

在另一个(间接给出的)示例中,您显然想要更改两个变量的内容(即交换它)。您可以从 Swap 函数的主函数中访问这些变量,但是如何使更改持久化呢?这只能通过引用调用来实现,因为您必须将更改的内容写入函数中保留下来的变量中。

以下内容将不起作用:

// 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); 
}

因此,通常要记住:

如果您想要进行的更改应该在函数结束后继续存在,请使用按引用调用。如果您只处理某些数据,但不想(或不得)更改其值,请使用按值调用。

关于c - 按值调用和按引用调用都有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42713986/

相关文章:

c++ - 为什么我在传递 vl 或 vl1 时得到与输出相同的值 (0x7fff5fbff808)?地址应该不同

c++ - C/C++ 中#define 的不同语法,包括许多语句

c - 将信号从 pthread 发送到 QObject

C程序内存映射

c++ - 我可以按值(复制)从一个 std::vector 插入一个对象到另一个吗?

Java 与 C++(按引用调用?)

c - 什么是 intel 机器中的 VIctim 缓存?我们可以禁用它吗?

c - 我如何在 Ada 中处理一个 int** ?

python - python中如何传入另一个相同类型的对象作为方法参数?

javascript - 为什么这个 Javascript 示例复制变量值而不是通过引用传递?