2010-08-03 111 views
0

IBM在下面的示例(包括源文件)中解釋了C++通過引用傳遞。C++通過參考程序傳遞

如果我將void swapnum...更改爲void swapnum(int i, int j),它會變成價值傳遞嗎?

// pass by reference example 
// author - ibm 

#include <stdio.h> 

void swapnum(int &i, int &j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main(void) { 
    int a = 10; 
    int b = 20; 

    swapnum(a, b); 
    printf("A is %d and B is %d\n", a, b); 
    return 0; 
} 

Source

回答

6

如果按值傳遞,則執行的任何交換隻會在傳入的函數中受影響或看到,而不在調用代碼中。另外,一旦你回到主界面,你會看到a和b沒有交換。這就是爲什麼當交換你想通過ref的數字。

如果你只是問是否它將被稱爲,那麼是的,你是對的,你會通過價值。

下面是一個例子:

#include <stdio.h> 

void swapnum(int &i, int &j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

void swapByVal(int i, int j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main(void) { 
    int a = 10; 
    int b = 20; 

    swapnum(a, b); 
    printf("swapnum A is %d and B is %d\n", a, b); 

    swapByVal(a, b); 
    printf("swapByVal A is %d and B is %d\n", a, b); 

    return 0; 
} 

運行這段代碼,你應該看到,改變由參考交換隻能堅持,那就是我們已經返回後,返回主值被交換。如果你按值傳遞,你會看到調用這個函數並返回到main,實際上a和b沒有交換。

+0

你忘了命名你的第二個swapnum方法swapByVal – RickNotFred 2010-08-03 18:04:08

+0

@RichNotFred - 我會說它仍然非常接近星期一,所以請原諒我:)。雖然編輯。 – JonH 2010-08-03 18:05:49

3

是的,但是這意味着swapnum將不再起作用顧名思義

+0

謝謝你,麥克。所以我想我也可以傳遞指向swapnum的指針,但是我必須傳遞他們的地址?例如: 例如: int * p,* q; swapnum(&p,&q) – 2010-08-03 18:01:27

+0

@Kevin - 這是正確的,你會傳遞指針的地址。 – JonH 2010-08-03 18:10:59

+0

如果您確實通過了* p,* q,那麼您會通過價值傳遞。 – JonH 2010-08-03 18:12:08

2

是。 '&'運算符指定參數應該指向傳入的內存地址。

通過刪除此運算符,將創建對象的副本並將其傳遞給該函數。