#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
これを理解する鍵は、 'B =(* PTR2)++である;' 'ptr2'が指して、その値にアクセス*後*それをインクリメントしているものを取ること。 – dawg
ですが、bの値は5で、変更されませんでしたか?どうして ? – blitz
@blitz 'x ++'と '++ x'の違いを読んでください。 – Siguza