2017-03-10 8 views
-4

Iが出力されます 値の呼び出しと参照作業による呼び出しの両方?

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

「有名なスワップ関数の例」?あなたは何を念頭に置いていますか? –

+0

メソッドのシグネチャを変更しました: 'int Add(int * a、int * b)'。明らかに '&a'と'&b'で動作します! – xanatos

+1

Cは参照渡しをサポートしていません。 **厳密には値渡しです。また、_methods_もサポートしていません。 – Olaf

答えて

-1

したがって、値による呼び出し方法が有効であるかどうかを判断するにはどうすればよいですか。

まあ、あなたの機能が何をしようとしているかによって異なります。あなたの上記の例では

、あなただけは、コンピューティングのための(x、y)の値を必要としますが、変更する予定はありません彼らの価値あなたの関数中。この場合、参照によるコールは機能しますが、不要です。

他の(間接的に与えられた)例では、明らかにに変更することをお奨めします。 2つの変数の内容(つまり、それを入れ替えます)。スワップ機能のメイン関数からこれらの変数にアクセスできますが、どのように変更を永続化できますか?これは、参照によって呼び出すことによってのみ可能です。なぜなら、変更された内容を関数に残っている変数に書き込む必要があるからです。

以下は動作しません。

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

何ですか? Obvioulsy ... – vonAlenberg

+0

参照を指定するC標準への参照を提供してください。あなたは明らかにCとC++を混同します。 – Olaf

関連する問題