2016-07-26 15 views
4
#include<iostream> 
#include<conio.h> 
using namespace std; 
int main() 
{ 
    int i=10, j=20, k=30; 
    int *ip1, *ip2, **ipp; 
    ip1=&i; 
    ip2=&j; 
    ipp=&ip1; 
    *ipp=ip2; 
    *ipp=&k; 
    cout<<*ip1<<endl; 
    cout<<*ip2<<endl; 
    cout<<**ipp; 
    getch(); 
} 

cout<<*ip1;はコンソールに30を印刷します。どのように説明できますか?出力は -この複数の間接参照はどのように機能していますか?

30 
20 
30 

私は期待していた -

10 
20 
30 

を、私はこのケースで働いているか、複数の間接知りません。

+0

最後の2つの出力がクリアな場合は、削除しないでください。それは、質問をはるかに簡単に – user463035818

+0

を読むようになりました私はそれがこのように問題を理解することが簡単だろうと思った。 –

+0

@AseemBhardwajはい、これらのステートメントを完全に理解していない場合は、どの部分が必要かを判断するのが難しいかもしれません。とにかく、あなたは今それを決めることができると思います。 :) – songyuanyao

答えて

0

変数ippポイント

ipp=&ip1; 

だから、ポインタippのいずれかの間接参照はポインタip1の値が得られます。したがって、例えば、この文の

*ipp=ip2; 

ip1 = ip2; 

と、この文と同じです

*ipp=&k; 

結果ip1として

ip1 = &k; 

に相当したアドレスが含まれています変数kippにはアドレスip1が含まれています。

そして、これらの文

cout<<*ip1<<endl; 
//... 
cout<<**ipp; 

は、最初の文でendlとオペレータ< <の呼び出しによって提供される改行文字を除いて同じ結果を生成します。変数kの値を出力します。

2

ラインcout < < * ip1;コンソールに30を印刷する、どのように説明することができますか?

あなたはipp(ポインタのポインタ)を介してip1の値を変更したため、その後、最後にkを指し示すに、jを指すに、iを指すから。原因このステートメントに変数ip1

ipp=&ip1;   // make ipp point to ip1 
*ipp=ip2;   // dereference on ipp, change the value of pointee (i.e. ip1) to ip2 
        // i.e. make ip1 point to j 
*ipp=&k;   // change the value of pointee (i.e. ip1) to the address of k 
        // i.e. make ip1 point to k 
cout<<*ip1<<endl; // now we get 30 (i.e. the value of k) 
+0

ありがとうございます。一つのことは、* ipp = ip2を省略した場合です。出力は同じですが、その行は不要ですか? –

+0

@AseemBhardwaj可能でしょう。 '* ipp = ip2;'の効果がすぐに '* ipp =&k;'で上書きされるためかもしれません。 – songyuanyao

+0

ありがとう、もう一度。私は同じことを考えていた。 –

関連する問題