2015-06-07 152 views
0

我正在用指針練習並碰到這個東西。
下面的代碼給出了答案:C++中的指針混淆

1 
0 
3 

當我改變*帶* C的答案是相同的,但在不斷變化的* B = 0,得到的答覆是

1 
2 
0 

能否請您這些過程中幕後發生了什麼?

#include<iostream> 
using namespace std; 
void func(int *a, int *b,int *c) 
{ 
    a=b; 
    b=c; 
    c=a; 
    *a=0; 

} 


int main() 
{ 
    int a=1,b=2,c=3; 
    func(&a,&b,&c); 
    cout<<a<<endl<<b<<endl<<c; 

} 
+0

如果您對main中的變量使用了不同的名稱,那麼這會比說明函數的參數容易得多。 –

+0

是的。我知道。我的錯!但對我而言,這個問題同樣會很棘手。我終於明白了。感謝其中一位回答者! –

回答

2
a = 1 
b = 2 
c = 3 

爲了便於閱讀,我會在func變量重命名爲papbpc。那麼你在func混合起來,使:

  • pa點什麼pb指向(b
  • pb點什麼pc指向(c
  • pc點什麼pa指向(現在是b

因此

*pa = 0 

如下pa的指針(至b),並且設置爲0,給你:

a = 1 
b = 0 
c = 3 

然而

*pb = 0 

代替如下pb的指針(至c)並設置爲0,給你:

a = 1 
b = 2 
c = 0 
+0

謝謝你!我現在得到了:) –

0

當我改變*帶* C的答案是相同的

爲什麼你會想到什麼不同?你在上面寫了c=a;

與* B = 0變化的,答案是1 2 0

事實上,你之前寫過b=c;,在*b所以寫0將零出第三個參數的內容。

+0

請注意,這超出了毫無意義且有意混淆的地方。如果你真的想要學習C語言,那麼最好不要學習如何編寫乾淨的代碼,而不是寫如何編寫我現場解僱你寫的代碼。 – Blindy

+0

我在想什麼可能聽起來有點尷尬,但如果我錯了,請糾正我。 A現在指向B,所以A中發生的任何變化都將在B中而不是A中進行。第二步,B中的任何變化都必須在C中進行。因此,如果我們將* a更改爲0,則意味着b內存應該得到0但它被告知這個改變是在C中進行的,C現在得到0。然而C再次指向一個。所以最終得到0!所以它必須是0 2 3而不是1 0 3.請用邏輯來糾正我。 –

+0

@AtraenteHomem,'c'沒有指向原始的'a',你覆蓋它以指向原來的'b'。我會再次說你無意中將這些名字混淆了。選擇更好的。 – Blindy

1

你是第一個交換指針;唯一相關的信息是:

a=b; 

所以在func變量a現在指向的b在主地址。

然後

*a=0; 

設定變量afunc0值被指向(這是在主b現在)。

所以,abc是指針的東西,而abc有 「東西」。當您將func中的變量重命名爲其他內容時變得更容易,例如:pa,pbpc作爲「指針指向」。然後,你可以看到你交換指針和*pa=0的「設置pa指向到0值。

謹記這一點,應該清楚的是修改代碼將以不同的方式交換指針,從而導致不同結果。