#include <stdio.h>
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1); // what happens here ?
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
答えは 1 だと思っていたのに 5 になってしまった..なぜ?
int *ptr = (int*)(&a + 1); // what happen here ?
sizeof a配列のアドレスが取得され、それに 1 が追加されます。これにより、の先頭を過ぎたバイトを指すポインターが生成されますa。そのポインターは にキャストされ、int*に割り当てられptrます。同じことが達成できます
int *ptr = &a[5];
この場合。
thenは、 の前のバイト、つまり へptr - 1のポインタ、およびisです。sizeof(int)ptr&a[4]*(ptr - 1)a[4]
ポインタ演算は「ポインティのサイズ」の単位で行われます。は 5 - an&aの配列へのポインタであるため、1を追加するとバイトが移動します。intint (*)[5]5*sizeof(int)
&aは へのポインタでint[5]あり、したがって&a + 1再び へのポインタint[5]です。を緩める&と、すべてうまくいくはずです(また、キャストは不要になります):
int *ptr = a + 1;
int *ptr = (int*)(&a + 1); // what happen here ?
a= 配列の最初の要素のアドレス: a[0] (int のアドレス)
&a = 配列 a のアドレス、"a" と同じ値ですが、型は配列のアドレスなので、式 "(&a + 1)" は次の配列 "a" へのポインターです。(ptr - 1): 配列 "a" の最後の要素のポインターを意味する、ptr の前の int へのポインター。