やってみて!
int a[5] = {1, 2, 3, 4, 5};
printf("%#x, %#x, %#x, %#x\n", a, &a, a+1, &a+1);
0xbfa4038c, 0xbfa4038c, 0xbfa40390, 0xbfa403a0
それで、それは私たちに何を教えてくれますか?
0xbfa4038c == 0xbfa4038c
つまりa == &a
。これは、配列 or の最初の要素のアドレスですa[0]
。
*(a+1)
int のサイズは 4 であり、 == (配列の 2 番目の要素) であることがわかっています。a[1]
これは次のように証明されます。
0xbfa4038c + 0x4 = 0xbfa40390
つまりa + one int = address of the next element
したがって、 が表示された場合、配列に = 5 個の要素&a+1 == 0xbfa403a0
があることを意味します。((0xa0-0x8c)/4)
これは無効であることがわかっているa[5]
ので、配列の末尾を通過したことになります。
あなたが取るならば:
int *ptr = (int*)(&a + 1); //one passed last element in the array
printf("%d",*(ptr - 1));//back up one, or last element in the array and deference
それがあなたが得る理由です5