【问题标题】:Value of output is different (pointer) [closed]输出值不同(指针)[关闭]
【发布时间】:2017-10-21 15:08:16
【问题描述】:
#include<iostream>
using namespace std;

void HardToFollow(int *p, int q, int *num);


void HardToFollow(int *p, int q, int *num) {


*p = q + *num;  
  *num = q;    
  num = p;  
  p = &q;  
  cout << *p << " " << q << " " <<*num<<endl;

// value is ``1 1 4
}

main() {

int *q;
  int trouble[3];

  trouble[0] = 1;

  q = &trouble[1];

  *q = 2;

  trouble[2] = 3;

HardToFollow(q, trouble[0], &trouble[2]); // 2 1 3 

cout << *q << " " << trouble[0] << " " << trouble[2]<<endl;  

// value become 4 1 1}

大家好,我是 stackoverflow 的初学者,我真的不明白为什么我在 HardToFollow 函数中的第一个输出,值是 114

但是当涉及到主函数输出时,它变成了411。我花了很多时间试图理解,但我无法理解。

希望有人可以在这里帮助我。

【问题讨论】:

  • 使用调试器。
  • 除了使用调试器单步调试代码之外,我建议您阅读good C++ book。语句num = p; p = &amp;q; 仅修改变量的本地副本,并且一旦函数返回,此类更改不会保留。
  • @AlgirdasPreidžius,代码很好。这显然是一个“难以理解”的例子,教师提供了一个强迫学生理解为什么两个输出不同的例子。我相信老师不希望学生在stackoverflow上问解释。
  • @CostantinoGrana 我在哪里说不是?我说明了观察到的输出不同的原因。请重新阅读代码和我的评论。
  • @AlgirdasPreidžius 谢谢!但我不明白为什么当函数返回主函数中 *q 的值为 4 时。

标签: c++ pointers reference


【解决方案1】:

让我们看看HardToFollow() 收到了什么并逐行跟踪它的流程。

[我只想在这里指出,事实上,这段代码很难理解,所以我可能犯了一个错误。请仔细按照我的逻辑看你是否同意。]

HardToFollow()开头:

  • q-in-main = 故障地址[1](值 = 2)
  • p = 故障地址[1](值 = 2)
  • q-in-HardToFollow = 麻烦值的副本[0] = 1
  • num = 故障地址[2](值 = 3)

注意 p 和 q-in-main 不是同一个变量。它们是指向同一位置的两个独立指针。这是因为(我确信这是本练习的重点之一): 包括指针在内的变量作为副本传递。所以如果你发送一个指针,就会创建一个新的指针副本。

*p = q + *num;

p指向的位置的值设置为q-in-HardToFollow加上num指向的位置的值。这是1加3,也就是4。q-in-main也和p指向同一个位置,所以它的值也会发生变化。所以现在:

  • q-in-main = 故障地址[1](值 = 4)
  • p = 故障地址[1](值 = 4)

*num = q;

num指向的位置的值设置为q-in-HardToFollow,即1。所以现在:

  • num = 故障地址[2](值 = 1)

num = p;

num 现在被设置为指向与 p 相同的位置,即,trouble[1]。所以:

  • num = 故障地址[1](值 = 4)

p = &amp;q;

p 现在设置为指向 q-in-HardToFollow 的位置。所以:

  • p = q-in-HardToFollow 的地址(值 = 1)

所以当前的地址和值是:

  • q-in-main = 故障地址[1](值 = 4)
  • p = q-in-HardToFollow 的地址(值 = 1)
  • q-in-HardToFollow = 麻烦值的副本[0] = 1
  • num = 故障地址[1](值 = 4)

这很适合您获得的输出。

【讨论】:

  • 感谢!我真的不知道何时将指针传递给另一个函数实际上是在创建原始指针的副本。它解释得很好!
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多