2017-03-10 66 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