【问题标题】:C++ program for address and variables用于地址和变量的 C++ 程序
【发布时间】:2017-11-26 08:08:12
【问题描述】:

这段代码的输出是:

9

我不确定它在函数add1 中发生了什么变化。还有这个&n是什么意思,当我们将i分配给&n时它会做什么?

#include <iostream>

using namespace std;

int add1(int &n){
    n++;
    return n;
}

int main(){
    int m = 0;

    for (int i = 0; i < 5; i++){
        m += add1(i);
    }
    cout << m ;
    cout << "\n\n";

    return 0;
}

【问题讨论】:

  • 您应该阅读 C++ 中的参考资料。
  • 您需要坐下来花一些时间阅读一两本关于 C++ 的好书。 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list
  • 几乎但不完全重复:stackoverflow.com/questions/2564873/…
  • @Mostafa 使用调试器并逐行逐行执行代码最容易掌握这些内容。我强烈建议你学习这项技能。
  • @MostafaIbrahem 好吧,进入add1() 函数,观察i 的变化。

标签: c++ function pointers


【解决方案1】:

在参数列表中使用&amp; 时,会导致该参数作为引用传递给函数。

这意味着您的函数add1 中的n 将指向与您的main 函数中的i 相同的内存空间。对n 的更改也将反映在i 中,因为它们只是作为同一事物的不同名称。

【讨论】:

  • 我明白了,但在第二个循环中,我将作为 2 而不是 1 为什么??
【解决方案2】:

变量i作为参考参数传入add1,所以每一轮i增加2:

1st round: i = 0, m = 1
2nd round: i = 2, m = 4
3rd round: i = 4, m = 9

【讨论】:

  • 但我不应该在每个循环中增加 1 吗?不是2?! @elinx
  • @MostafaIbrahem 这正是“int&”在那里所做的,“add1”中的“n”与“main”中的“i”共享相同的内存。所以对“n”的任何操作都会影响“i”
【解决方案3】:

如果你有这样的功能

int add1( int n )
          ^^^^^
{
   n++;

   return n;
}

并像这样称呼它

m += add1(i);

然后该函数处理变量i 的值的副本。

如果在循环体中构建它,你可以想象如下方式

for ( int i = 0; i < 5; i++ )
{
    // m += add1(i);
    // function add1
    int n = i;
    n++;
    m += n;
}

当一个函数被这样声明时

int add1( int &n )
          ^^^^^
{
   n++;

   return n;
}

那么这意味着参数是对相应原始参数的引用。您可以将其视为参数的别名。

在这种情况下,如果在循环体中构建它,您可以想象以下方式

for ( int i = 0; i < 5; i++ )
{
    // m += add1(i);
    // function add1
    i++; 
    m += i;
}

所以变量i在函数add1中被改变了两次,因为它是通过引用n直接在函数中使用的,并且在循环的控制语句中。

【讨论】:

    【解决方案4】:

    这里我们通过引用传递将参数传递给 add1() 函数。要通过引用传递变量,我们只需将函数参数声明为引用而不是普通变量。

    在上面的代码中,

    int add1(int &n){ // n is a reference variable
        n++;
        return n;
    }
    

    当函数被调用时,n 将成为对参数的引用。由于对变量的引用与变量本身完全相同,因此对引用所做的任何更改都会传递给参数!

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 2010-10-09
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多