理解传递值结果
Understanding Pass-By-Value-Result
考虑以下程序
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]);
}
我正在努力理解按值传递结果。然而无法掌握它。我知道它类似于按引用传递。但是以什么方式呢?在上述情况下,结果有何不同?它什么时候实际使用值的 "reference" ?
可能在您发布的代码中,您想要 "foo(a[i], a[i]);" 而不是 "p(a[i], a[i]);"。
无论如何,您的 a[0] 和 a[1] 将保持设置为 1,因为 foo() 按值获取参数,并且 foo() 无法以可见的方式更改其参数外面。
按值传递和按引用传递相似只是因为它们都执行一个"passing"。按值传递涉及数据的复制:foo() 接收 a[0] 的副本和 a[1] 的副本; foo() 称它们为 x 和 y。然后 foo() 递增两者,但是 x 和 y 是仅对 foo() 可见的副本,所以实际上什么也没有发生,因为在递增之后 x 和 y 不再被使用。
在foo()里面有一个变量i的增量,它是全局的。而这一次,变量得到了真正的修改,并且每个人都可以看到更改。
引用传递的不同之处在于 foo() 将接收变量的地址(引用),而 foo() 将能够读取但也可以写入 "in" 该引用,因此修改住在那里的对象。
想想这个例子。我是 main() 而你是 foo()。我有一张 sheet 的纸,上面写着一些东西,比如说一首歌的名字。我可以让你知道这首歌的名字,方法是取另一个 sheet,把名字复制到上面,然后把新的 sheet 给你。这是按值传递。
不同的是,如果我对你说:"the sheet is on the table"(table 是数据的位置,"reference")。你去那里,看看sheet,就知道歌名了。但是您也可以修改位于 table 上的我的 sheet。这是通过引用传递:我告诉你数据在哪里。当然,准确的说,我跟你说sheet在哪里,是拿一个sheet写在上面"the sheet with the title is on the table",然后给你新的sheet。你,foo(),收到一个sheet(按值传递),你也可以销毁或修改它,我永远不会注意到。不过在修改这个迟早没用的新sheet之前,用它在table上看看,不要用上面的歌名修改MYsheet! :-)
结果是:
2
1
这是因为,在按值传递结果中,对调用函数中的变量所做的任何修改在函数退出之前不会更新。
使用相同的程序,使用传递引用,
3
1
将被打印出来,因为它引用相同的地址并立即更新所做的任何修改。
考虑以下程序
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]);
}
我正在努力理解按值传递结果。然而无法掌握它。我知道它类似于按引用传递。但是以什么方式呢?在上述情况下,结果有何不同?它什么时候实际使用值的 "reference" ?
可能在您发布的代码中,您想要 "foo(a[i], a[i]);" 而不是 "p(a[i], a[i]);"。
无论如何,您的 a[0] 和 a[1] 将保持设置为 1,因为 foo() 按值获取参数,并且 foo() 无法以可见的方式更改其参数外面。
按值传递和按引用传递相似只是因为它们都执行一个"passing"。按值传递涉及数据的复制:foo() 接收 a[0] 的副本和 a[1] 的副本; foo() 称它们为 x 和 y。然后 foo() 递增两者,但是 x 和 y 是仅对 foo() 可见的副本,所以实际上什么也没有发生,因为在递增之后 x 和 y 不再被使用。
在foo()里面有一个变量i的增量,它是全局的。而这一次,变量得到了真正的修改,并且每个人都可以看到更改。
引用传递的不同之处在于 foo() 将接收变量的地址(引用),而 foo() 将能够读取但也可以写入 "in" 该引用,因此修改住在那里的对象。
想想这个例子。我是 main() 而你是 foo()。我有一张 sheet 的纸,上面写着一些东西,比如说一首歌的名字。我可以让你知道这首歌的名字,方法是取另一个 sheet,把名字复制到上面,然后把新的 sheet 给你。这是按值传递。
不同的是,如果我对你说:"the sheet is on the table"(table 是数据的位置,"reference")。你去那里,看看sheet,就知道歌名了。但是您也可以修改位于 table 上的我的 sheet。这是通过引用传递:我告诉你数据在哪里。当然,准确的说,我跟你说sheet在哪里,是拿一个sheet写在上面"the sheet with the title is on the table",然后给你新的sheet。你,foo(),收到一个sheet(按值传递),你也可以销毁或修改它,我永远不会注意到。不过在修改这个迟早没用的新sheet之前,用它在table上看看,不要用上面的歌名修改MYsheet! :-)
结果是:
2
1
这是因为,在按值传递结果中,对调用函数中的变量所做的任何修改在函数退出之前不会更新。
使用相同的程序,使用传递引用,
3
1
将被打印出来,因为它引用相同的地址并立即更新所做的任何修改。