在C+;中,为什么或在什么情况下将参数作为引用(或指针)传递给函数+;? 我习惯于在自己的代码中定期传递参数,但经常会在读取其他C++代码时偶然遇到由引用或指针传递的函数参数。我不明白这样做的目的是什么。有人能解释一下吗?

在C+;中,为什么或在什么情况下将参数作为引用(或指针)传递给函数+;? 我习惯于在自己的代码中定期传递参数,但经常会在读取其他C++代码时偶然遇到由引用或指针传递的函数参数。我不明白这样做的目的是什么。有人能解释一下吗?,c++,pointers,reference,pass-by-reference,pass-by-pointer,C++,Pointers,Reference,Pass By Reference,Pass By Pointer,如果我将一组字符传递给函数,我可以在函数内部更改它们,而在函数外部它们将保持不变。这意味着如果你想大写一些文字,你必须复制一份,然后更改一些字母 另一方面,如果您告诉函数该字符串在内存中的地址,则它可以更改现有字符串而无需复制。有时,所需的参数将消耗很少的大小。其他时候,所需的数据需要数百兆/千兆/兆字节。你最不想做的事情就是读入所有内容,然后制作一份副本,发送给函数 引用和指针之间的区别对于程序员来说主要是方便的语法,但这条规则也有一些重要的例外情况。如果将参数传递给函数,则可以在函数内部对其

如果我将一组字符传递给函数,我可以在函数内部更改它们,而在函数外部它们将保持不变。这意味着如果你想大写一些文字,你必须复制一份,然后更改一些字母

另一方面,如果您告诉函数该字符串在内存中的地址,则它可以更改现有字符串而无需复制。有时,所需的参数将消耗很少的大小。其他时候,所需的数据需要数百兆/千兆/兆字节。你最不想做的事情就是读入所有内容,然后制作一份副本,发送给函数


引用和指针之间的区别对于程序员来说主要是方便的语法,但这条规则也有一些重要的例外情况。

如果将参数传递给函数,则可以在函数内部对其进行更改。一旦该函数的执行完成,传入的变量将重命名不变

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. */

您可以参考本页:

这样做的主要原因有三个

减少内存使用 每次调用函数时,都会复制并传递参数。当你传递数字时,这不是什么大不了的事。但是,当您处理大块内存时,如对象、结构、数组等,这将变得非常昂贵

因此,所有复杂类型通常都作为指针传递。如果你在扔东西,你总是用指针

此实例中应使用
const
限定符来指示变量不会更改

修改参数 有时修改传递的参数是有用的,尽管这应该作为错误的样式来避免。我认为最好的例子是修改数组,例如
push()
函数。另一种是修改对象的公共成员,或者当您希望从函数返回多个值时

请注意,这可能是bug的来源。如果您正在修改传递的变量,那么从函数名称可以明显看出这就是您正在做的事情

低电平存储器存取
任何直接使用内存的东西都需要直接访问所述内存。C中的标准实践,但在C++中不常见。查看类似于
memcpy()
的函数以及

中的任何其他函数,执行此操作的原因包括:

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

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

      < P>通过引用:(仅在C++中,而不是在C中):当我们希望通过调用函数进行变量的更改时。 通过指针传递:从periferi来看,它的工作原理与引用相同,但存在差异