#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を追加するとバイトが移動します。int
int (*)[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 へのポインター。