2010-08-03 107 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

是。 '&'运算符指定参数应该指向传入的内存地址。

通过删除此运算符,将创建对象的副本并将其传递给该函数。