私は良い重複答えを見つけることができないので、ここで何が起こっているのです:
ポインタ演算は常にポインタの基本型の単位で行われます。つまり、T *ptr
(あるタイプのポインタT
)を持っている場合、ptr + 1
はメモリの次のバイトではなく、次のT
です。すなわち
、アレイとインデックスの組み合わせのようなポインタを想像することができるが:
T *ptr;
T array[/*some size*/];
ptr = &array[n];
ptr
がarray[n]
へのポインタ(n番目の要素)である場合、ptr + i
がarray[n + i]
へのポインタであります((n + i)番目の要素)。
はのは、あなたのコードを見てみましょう:あなたはそれに
32
を追加し、その後、
basepointer
に
(int*)
をキャストしている。ここ
*((int*)basepointer+32) = 455;
。これにより、basepointer
の後に32番目のint
のアドレスが表示されます。プラットフォームが4バイトの整数を使用する場合、実際のオフセットは32 * 4 = 128
バイトです。ここには455
が保管されています。
は、その後、あなたはbasepointer
がvoid *
あるので、これは技術的に無効なコードで、void
は何のサイズを持っていないので、あなたはvoid
の面で算術演算を行うことはできません
void *p = basepointer + 32;
を行います。拡張として、gccはこれをサポートし、void
のサイズは1
です。 (しかし、あなたが本当にこれに頼るべきではありません:あなたはアドレス指定をバイト単位たい場合unsigned char *
へのキャスト)
今p
がでbasepointer
後32
オフセットされます。
a = *((int*)basepointer+32);
これは上からポインタ演算を繰り返し、依然として455
ある32をオフセットint
の値を(すなわち、バイト128
オフセット)、検索します。
b = *((int*)p);
これはバイトで保存int
値が32
(int
に対応するこの例では8
オフセット)オフセットを取得します。ここには何も格納されていないので、b
は本質的にはガベージです(プラットフォーム上では0
)。
このコードを動作させるための最小の変化予想通り、おそらく
void *p = (int *)basepointer + 32; // use int-wise arithmetic to compute p
代わりに2行目で '*(int *)(basepointer + 32)= 455;'を試してください。次に、ポインタ演算について読んでください。 – aragaer
@aragaer 'basepointer'が' void * '型を持っていると良い考えはありません。 – aschepler
ベースポインタの種類は何ですか? – Bathsheba