6
#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 になってしまった..なぜ?

4

4 に答える 4

12
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)

于 2013-02-28T17:09:05.473 に答える
5

&aは へのポインタでint[5]あり、したがって&a + 1再び へのポインタint[5]です。を緩める&と、すべてうまくいくはずです(また、キャストは不要になります):

int *ptr = a + 1;
于 2013-02-28T17:08:44.333 に答える
1
int *ptr = (int*)(&a + 1);  // what happen here ?

a= 配列の最初の要素のアドレス: a[0] (int のアドレス)

&a = 配列 a のアドレス、"a" と同じ値ですが、型は配列のアドレスなので、式 "(&a + 1)" は次の配列 "a" へのポインターです。(ptr - 1): 配列 "a" の最後の要素のポインターを意味する、ptr の前の int へのポインター。

于 2013-03-01T02:25:29.070 に答える