我习惯于在自己的代码中定期传递参数,但是经常在阅读别人的C ++代码时偶然发现函数参数是通过引用或指针传递的。我不明白这样做的目的是什么。有人可以解释一下吗?
答案 0 :(得分:1)
完成此操作基本上有三个原因。
每次调用函数时,都会复制并传递参数。当您传递数字时,这没什么大不了的。但是,当您处理大块内存时,例如对象,结构,数组等,这将变得非常昂贵。
因此,所有复杂类型通常都作为指针传递。如果要扔对象,则始终使用指针。
在这种情况下,应使用const
限定符表示该变量不会被更改。
有时,修改传递的参数很有用,尽管应避免将其视为不良样式。我认为最好的示例是修改数组,例如push()
函数。另一个是修改对象的公共成员,或者当您要从函数返回多个值时。
请注意,这可能是错误的来源。如果您要修改传递的变量,则从函数名称中可以明显看出这就是您正在做的事情。
任何与内存直接兼容的东西都希望直接访问该内存。 C语言中的标准做法,但在C ++中不那么常见。看一下memcpy()
之类的函数以及<string.h>
中的其他函数。
答案 1 :(得分:0)
如果我将一堆字符传递给函数,则可以在函数内部进行更改,它们在函数外部将保持不变。这意味着如果您希望将某些文本大写,则必须对其进行复制,然后更改其中的一些字母。
另一方面,如果您告诉函数该字符串在内存中的地址,则它可以更改现有字符串而不进行复制。有时,所需的参数将消耗很小的大小。有时,所需的数据占用数百兆/千兆/兆字节。您要做的最后一件事是阅读所有内容,然后制作一份副本,以发送给函数。
引用和指针之间的区别主要是程序员使用方便的语法,但是该规则也有重要的例外。
答案 2 :(得分:0)
如果将参数传递给函数,则可以在函数内部对其进行更改。该函数执行完成后,传入的变量将重命名为不变。
int square_this_number(int x)
{
int y = 0;
y = x * x;
x = 1000;
return y;
}
int a = 10;
int b = 0;
b = square_this_number(a);
/* a is still 10, not 1000. */
/* b is 100. */
通过引用传递或通过指针传递意味着您希望在函数执行完成后保留更改。
int try_square_and_change_input(int& x)
{
int y = 0;
y = x * x;
x = 23;
return y;
}
int a = 5;
int b = 0;
b = try_square_and_change_input(a);
/* a is now 23 instead of just 5. */
/* b is 25 of course. */
您可以参考以下页面:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/cplr233.htm
答案 3 :(得分:0)
这样做的原因包括:
memcpy()
一样。答案 4 :(得分:0)
按值传递:当我们不想更改被调用函数的变量值时。
通过引用传递:(仅在c ++中,而不在c中):当我们想通过调用函数对variabe进行更改时。
通过指针传递:与periferi一样,它与参考相同,但存在差异。