2017-03-10 44 views
-4

我认为,通过值调用函数不会有任何效果,我应该始终参考使用电话,但尝试这种代码...既通过价值调用,又通过参考调用工作?

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

那么如何判断是否“按值调用”去上班还是不打电话?!

+0

“着名的swap函数示例”?你有什么考虑? –

+0

您已更改方法的签名:“int Add(int * a,int * b)'。很明显,它现在可以和'&a'和'&b'一起使用! – xanatos

+1

C不支持通过引用。这是**严格**按价值传递。它也不支持_methods_。 – Olaf

回答

-1

那么我怎样才能判断价值方法的调用是否有效?

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

在你上面的例子中,你只需要的(X,Y)值的计算,但你的函数中你永远不打算变化自己的价值。尽管在这种情况下引用引用将起作用,但这不是必需的。

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

下将无法正常工作:

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

所以按照规则要牢记:

如果你想这是应该生存的函数结束的改变,使用呼叫逐参考。如果您只是处理一些数据,但不想(或不能)更改其值,请使用按值拨打电话。

+0

C不支持通过引用调用。这个问题是毫无意义的。 – Olaf

+0

什么?!它确实...... – vonAlenberg

+0

请在提供参考的C标准中提供参考。你显然混淆了C和C++。 – Olaf