为什么或在什么情况下,您会将参数传递给函数作为C ++中的引用(或指针)?

时间:2018-09-21 01:56:19

标签: c++ pointers reference pass-by-reference pass-by-pointer

我习惯于在自己的代码中定期传递参数,但是经常在阅读别人的C ++代码时偶然发现函数参数是通过引用或指针传递的。我不明白这样做的目的是什么。有人可以解释一下吗?

5 个答案:

答案 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)

这样做的原因包括:

  • 我需要修改一个不是所调用函数局部变量的变量。
  • 我想向函数传递一个单词,而不是复制大型结构或数组(如果需要修改的话,可以复制另一个结构)。
  • 这是指向共享内存的指针,我希望更改在不同的进程或线程中可见。
  • 这是一个指向多态结构或联合(或C ++中的类)的指针,我希望该函数能够在运行时确定正确的类型。
  • 数据的大小和类型可能与memcpy()一样。
  • 该类型对于客户端代码应该是不透明的。
  • 这就是指定接口的方式。

答案 4 :(得分:0)

按值传递:当我们不想更改被调用函数的变量值时。

通过引用传递:(仅在c ++中,而不在c中):当我们想通过调用函数对variabe进行更改时。

通过指针传递:与periferi一样,它与参考相同,但存在差异。