2017-10-21 150 views
-7
#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} 

大家好我是初學者到計算器,我真的不知道爲什麼我的第一輸出HardToFollow功能,價值114輸出的值是不同的(指針)

但是,當涉及到主要功能輸出它變成4,11。我花了很多時間嘗試理解,但我不能。

希望有人能幫助我。

+3

使用調試器。 – 2017-10-21 15:15:53

+2

除了遍歷代碼,使用調試器,我建議你閱讀[良好的C++書](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list )。語句'num = p; p =&q;'只修改變量的本地副本,並且一旦函數返回,這些更改就不會被保留。 –

+1

@AlgirdasPreidžius,代碼很好。這顯然是一個「難以遵循」的例子,教師提供這個例子來迫使學生理解爲什麼兩個輸出是不同的。我相信教師不會希望學生詢問有關計算器的解釋。 –

回答

0

讓我們來看看HardToFollow()接收並逐行跟蹤其流程。

[我只是在這裏注意到,這段代碼實際上非常難以遵循,所以有可能我犯了一個錯誤。請認真按照我的邏輯,看看你是否同意]

截至HardToFollow()開始:

  • 的Q-in-主要=麻煩地址[1](值= 2)
  • p =麻煩地址[1](值= 2)
  • Q-中HardToFollow =的麻煩值拷貝[0] = 1個
  • NUM =麻煩地址[2](值= 3)

請注意,p和q-in-main不是同一個變量。它們是指向相同位置的兩個單獨的指針。這是因爲(我敢肯定這是本練習的重點之一):變量,包括指針作爲副本傳遞。所以如果你發送一個指針,就會創建一個新的指針副本。

*p = q + *num;

位置的值所指向的p設爲Q-在-HardToFollow加上位置的值由NUM指向。這是1加3,即4。q-in-main也指向與p相同的位置,因此其值也會改變。所以,現在:

  • Q-中主要=麻煩地址[1](值= 4)
  • P =麻煩地址[1](值= 4)

*num = q;

位置的值所指向的NUM設爲q-在-HardToFollow,其爲1。因此,現在:麻煩

  • NUM =地址[ 2](值= 1)

num = p;

NUM現在被設置爲指向相同的位置爲p,即,麻煩[1]。所以:

  • NUM =麻煩地址[1](值= 4)

p = &q;

p被現在設置爲指向的Q-in-HardToFollow的位置。所以:

  • P = Q-在-HardToFollow的地址(值= 1)

所以當前地址和值是:

  • Q-中主要=的地址麻煩[1](值= 4)
  • p = q-在-HardToFollow的地址(值= 1)
  • Q-中HardToFollow =的麻煩值拷貝[0] = 1
  • num =故障地址[1](值= 4)

這可以很好地處理您輸出的結果。

+0

thx!我真的不知道何時傳遞指向另一個函數的指針實際上是創建原始指針的副本。它很好解釋! –