2016-09-15 9 views
-3

仕組みを理解したいが、何が参考になっになるので、私は、ポインタの概念を苦手私はこのコードの一部は、私はこのコードの一部は、私は、それは簡単なようだ知ってどのように動作するかを理解したい

#include<stdio.h> 
    int main(){ 
     int a,b; 
     int *ptr1,*ptr2; 
     a=5; 
     b=a; 
     ptr1=&a; 
     ptr2=ptr1; 
     b=(*ptr2)++; 
     printf("a = %d, b=%d,*ptr1=%d,*ptr2=%d\n",a,b,*ptr1,*ptr2); 
    } 

と出力は私がunderstundする必要が

a = 6 , b = 5 , *ptr1 = 6 , *ptr2 = 6. 

あるのは、アドレスとvalによって視覚化してみましょうあなたに

+2

これを理解する鍵は、 'B =(* PTR2)++である;' 'ptr2'が指して、その値にアクセス*後*それをインクリメントしているものを取ること。 – dawg

+0

ですが、bの値は5で、変更されませんでしたか?どうして ? – blitz

+1

@blitz 'x ++'と '++ x'の違いを読んでください。 – Siguza

答えて

4
#include<stdio.h> 

int main(){ 
    int a,b; 
    int *ptr1,*ptr2; 
    a=5;  // Assigns value 5 to a 
    b=a;  // Assigns value of a (i.e., 5) to b 
    ptr1=&a; // Assigns address of a to prt1 or ptr1 points to variable a 
    ptr2=ptr1; // ptr2 holds same address as ptr1 does (i.e, address of a) 

    b=(*ptr2)++; 
    /* 
     Now this one is tricky. 
     Look at precedence table here 
     http://en.cppreference.com/w/cpp/language/operator_precedence 
     b is assigned value of *ptr2 first and then 
     value at *ptr2 (i.e., 5) is incremented later. 
     Try replacing b = (*ptr2)++ with b = ++(*ptr2). It'll print 6. 
    */ 

    printf("a = %d, b=%d,*ptr1=%d,*ptr2=%d\n",a,b,*ptr1,*ptr2); 
} 

に感謝ueテーブル。 intは、あなたのプログラムの1バイトまたは1単位とアドレススペースは100

a = 5 

    a  
+---+---+---+---+---+-- 
| 5| | | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

b = a 

    a b 
+---+---+---+---+---+-- 
| 5| 5| | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

ptr1=&a 

    a b ptr1 
+---+---+----+----+---+-- 
| 5| 5| 100| | | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 

ptr2 holds some random address when you initialize. 

int *ptr2; 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 5| 5| 100| 234| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 


ptr2=ptr1 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 5| 5| 100| 100| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 

b=(*ptr2)++ 

First, dereference *ptr2 and assign that to b. 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 5| 5| 100| 100| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 
^   | 
    |____________| 

Now increment value at address 100 

    a b ptr1 ptr2 
+---+---+----+----+---+-- 
| 6| 5| 100| 100| | ... 
+---+---+----+----+---+-- 
100 101 102 103 104 ... 

vizulizationが役立つことを期待して始まりであると仮定します。

読むここでポインタ代入について:C++ pointer assignment

+0

「// ptr2はptr1を指します」は「ptr1をptr2に割り当てます」。 'ptr2'は' ptr1'を指しません。詳細: "first and then"は可能性がありますが、_order_は定義されていません。 2つのイベントが_some_ sequence_(またはそうではない)の中で起こるような感じですが、_effect_はあなたがコメントした通りです。変数のアクセスに副作用がある場合は、Orderによって違いが生じます。 – chux

+0

'ptr2 = ptr1'の場合はどうでしょうか?:ptr2はptr1と同じアドレスを保持するようになりました。 –

関連する問題