为啥在这个程序中使用指针而不是常规变量?

Posted

技术标签:

【中文标题】为啥在这个程序中使用指针而不是常规变量?【英文标题】:Why is a pointer used in this program instead of regular variables?为什么在这个程序中使用指针而不是常规变量? 【发布时间】:2021-09-22 12:53:56 【问题描述】:

谁能解释一下这段代码是如何工作的?指针有点令人困惑,所以我需要一点帮助来了解正在发生的事情。我知道它正在计算总和和绝对差,但我不明白为什么我们需要这里的指针。请帮忙。

#include <iostream>

using namespace std;

void update(int *a, int *b)     
   int sum = *a + *b;
   int abs = *a - *b;
   if (abs < 0) abs *= -1;
   cout << sum << '\n' << abs;


int main() 
   int a, b;
   int *pa = &a, *pb = &b;
   cin >> a >> b;
   update(pa, pb);
   return 0;

【问题讨论】:

这里不需要指针。你在哪里找到这个的?听起来你可以使用good C++ book 这里完全没有必要,只是一个没有意义的插图。 我猜你的导师正在解释为什么在某些情况下通过引用传递参数可能比通过值传递参数更好.但这不是其中一种情况。 ...我不明白这里为什么需要指针... 我们这里不需要指针。没有什么可得到的。您的见解是正确的。 @molbdnilo 老师对指针的迷恋到底是什么?对于 C++,他们确实应该首先通过值和引用传递来教学。哦,好吧... 【参考方案1】:

我不明白为什么我们在这里需要指针

我们没有。这段代码是不必要的复杂。我最好的猜测是你的老师正在建立一些他们还没有向你展示过的东西。

这里使用指针是没有意义的。没有双关语的意思。不用指针你也可以做同样的事情。

这并不意味着指针是无用的。它们非常重要。但是那段代码只是……不适合显示它们的重要性。

【讨论】:

【参考方案2】:

你是对的。这令人困惑。代码是不必要的困难,在很多方面。

让我们看看发生了什么。函数update(int *a, int *b) 将两个指向整数的指针作为参数。也就是说,当你调用它时,你传递了两个变量的地址ints。该函数加减实际整数,使用* 运算符取消引用指针,意思是读取ab 指向的实际变量。

不需要将参数作为指针传递,我对这段代码所做的第一个更改是按值传递变量。 update() 需要知道的只是值,而不是变量在内存中的位置。 (如果它需要更改这些变量的值,那就不同了。)调用该函数的唯一结果是打印值之间的总和和绝对差,这就是为什么我对代码的第二件事'd 改变的是这个函数的名字。

查看main()我们看到传递的参数确实是两个变量的地址,是使用&amp;操作符的address-of得到的。请注意,main() 中定义的变量与update() 中的参数名称相同,这可能会造成混淆,因为它们完全不同。在一种情况下,它们是整数;在另一个,指向整数的指针。但是即使它们是相同的类型,它们也会引用内存中不同位置的不同变量,程序员可能会混淆两者。所以我要做的最后一个更改是重命名变量。

void print_sum_difference(int i1, int i2)     
   int sum = i1 + i2;
   int abs = i1 - i2;
   if (abs < 0) abs *= -1;
   cout << sum << '\n' << abs;


int main() 
   int a, b;
   cin >> a >> b;
   print_sum_difference(a, b);
   return 0;

说了这么多……为什么要使用指针?我猜有问题的代码是使用“通过引用”机制允许函数修改调用代码中的值的一步。当我们按值传递时,就像我上面的代码一样,函数被赋予了变量的副本。生成两个新整数,复制值,然后函数开始使用它们。如果它改变了它们,main() 中的变量不会改变。但在原始代码中,可以通过update() 中的代码更改值,例如*a=0;,这更改main()a 的值。

【讨论】:

感谢您的详细解释。我想我有点明白了,但是像你说的那样在这个特定的程序中使用指针仍然没有意义。

以上是关于为啥在这个程序中使用指针而不是常规变量?的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何把指针中的值取出来赋给常规变量

为啥当我使用变量存储数值结果而不是重新计算时,C++ 程序运行速度较慢?

为啥指针分配的内存在函数之后仍然存在,而不是数组?

指针变量初始化为NULL啥意思

为啥我们使用指针而不是简单地创建特定大小的数组?

在C语言编程中,为啥要将指针变量在开始的时候赋值为NULL?