输出值不同(指针)

时间:2017-10-21 15:08:16

标签: c++ pointers reference

#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。我花了很多时间尝试去理解,但我不能。

希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

让我们看一下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 = &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)

这对你得到的输出效果很好。