了解传值 - 结果

时间:2017-12-09 07:21:50

标签: pass-by-reference pass-by-value

考虑以下计划

int i;
int a[2];
void foo(int x, int y)
{
    x++;
    i++;
    y++;
}

main()
{
    a[0] = 1;
    a[1] = 1;
    i = 0;
    foo(a[i], a[i]);
    print(a[0]);
    print(a[1]);
}

我非常努力地理解传值的结果。然而,无法掌握它。我知道它类似于传递参考。但是以什么方式?在上述情况下,结果有何不同?它何时实际使用"引用"价值观?

2 个答案:

答案 0 :(得分:0)

可能在您发布的代码中,您想要" foo(a [i],a [i]);"而不是" p(a [i],a [i]);"。

无论如何,你的a [0]和[1]将保持设置为1,因为foo()按值获取参数,并且foo()无法以外部可见的方式更改其参数

按值传递并通过引用传递是相似的,因为它们都执行"传递"。通过值传递涉及数据的重复:foo()接收[0]的副本和[1]的副本;和foo()将它们称为x和y。然后foo()递增两者,但是x和y只是foo()可见的副本,因此实际上没有任何事情发生,因为在增量之后不再使用x和y。

在foo()里面有一个变量i的增量,它是全局的。相反,这次变量得到了真正的修改,每个人都可以看到变化。

通过引用传递是不同的,因为foo()将接收变量的地址(引用),并且foo()将能够读取,但也可以在"中写入"那个参考,从而修改生活在那里的对象。

想想这个例子。我是main(),你是foo()。我有一张纸上写着一些东西,说一首歌的标题。我可以通过另一张纸,将名称复制到其上,然后将新纸张交给您,让您知道该歌曲的名称。这是值得传递的。

如果我对你说的话会有所不同:"表格在桌子上#34; (表格是数据的位置,"参考")。你去那里,看看表,所以你知道这首歌的标题。但你也可以修改我桌上的表格。这是通过引用传递:我告诉你数据在哪里。当然,准确地说,我通过另一张纸并在上面书写的方式来表达我在纸张所在的位置。#34;带有标题的纸张在桌子上#34;然后我给你新表。你,foo(),收到一张表(通过值传递),你也可以销毁或修改它,我永远不会注意到。但是在修改这张不久将无用的新表之前,请使用它来查看表格并且不要使用其上的歌曲名称修改MY表格! : - )

答案 1 :(得分:0)

结果是:

  

2

     

1

这是因为,在pass-by-value-result中,对函数内的变量所做的任何修改都不会更新,直到函数退出。

使用相同的程序,使用pass-by-reference,

  

3

     

1

将打印

,因为它引用相同的地址并更新立即执行的任何修改。