我们如何在函数 (C++) 中正确使用指针和对整数的引用?

问题描述 投票:0回答:1

在尝试手动解决时,我无法理解如何获取以下 C++ 代码输出的正确值。

#include <iostream>
using namespace std;

int f(int a, int & b,int *c){
    a += 1;
    b += 3;
    *c += 4;
    return a+b+(*c);
}
int main() {
    int a = 3, b = 4,c = 5;
    cout << "total: " << f(b,c,&a) << endl;
    cout << "a= " << a << " b= " << b << " c= " << c << endl;
    
    a = 3, b = 4,c = 5;
    cout << "total: " << f(a,a,&a) << endl;
    cout << "a= " << a << " b= " << b << " c= " << c << endl;
    return 0;
}

我知道结果应该是:

total: 20
a= 7 b= 4 c= 8
total: 24
a= 10 b= 4 c= 5

但每次我尝试手动解决此代码(尝试在一张纸上写下步骤和作业)时,我似乎无法获得正确的总数或值。任何人都可以帮助我理解函数内部发生的事情,包括 a、b 和 c(也许是逐步解释?)。必须有一些我不理解的引用/取消引用或导致我的逻辑错误的指针。甚至 ChatGPT 在尝试执行代码后也吐出了错误的答案......

例如,如果我尝试函数内的第一组输入,这就是我的理解:

  • int a = 4;
  • int &b = 5; //因为c = 5
  • int *c = &a; //&a = 3

然后开始执行函数体:

  • a += 1 现在给我 a = 5;
  • b += 3 现在给我 c = 8 因为 b 是对 c 的引用所以实际上只有 c 改变了;
  • *c += 4 现在将存储在 &a 中的值初始化为 3 并添加 4,因此 a 的新值为 7;

最终的结果是 a = 7,b = 4(没有改变),c = 8。这些值是正确的,但是函数的返回部分不适用于这些值:

a+b+(*c) 应该是 7+4+(7),但结果是 18,而正确答案是 20。

最糟糕的是,如果我第二次使用相同的逻辑调用该函数,我的值不正确但我的总数是正确的......我迷路了。

c++ function pointers reference pass-by-reference
1个回答
0
投票

最终的结果是 a = 7,b = 4(没有改变),c = 8。 这些值是正确的,但函数的返回部分不正确 使用这些值:

让您感到困惑的是,

a
中的
b
c
main
a
中的
b
c
f()
不同。的

return a+b+(*c);

使用

f()
所知道的
a
b
c
。这是
f()
的一部分。
f()
的变量是这个
return
语句唯一知道的,它完全不知道
main
中的任何变量。所以要知道这些变量是什么,你只需要重新阅读你自己写的内容:

a += 1 现在给我 a = 5;

b += 3 现在给我 c = 8 因为 b 是一个参考

但是这个

b
,就在这里是非常精确的,与
b
表达式中的
return
相同。

*c += 4 现在将存储在 &a 中的值初始化为 3 并添加 4,因此 a 的新值为 7;

但这就是表达式中的

c
。所以

return a+b+(*c);

计算

5+8+7
20
,如您所见。

第二个表达式以同样的方式工作。

f()
的变量使用与
main()
中的变量相同的名称这一事实让您感到困惑。一个指针和引用引用另一个中的变量也无济于事。

重命名

f()
中的变量可能对您有所帮助:

int f(int x, int & y,int *z){
    x += 1;
    y += 3;
    *z += 4;
    return x+y+(*z);
}

这在逻辑上应该等同于原始功能,但混淆较少。

© www.soinside.com 2019 - 2024. All rights reserved.