配列のアドレス+1と配列を指すポインタ+1の違い


1.ポインタの本質は、アドレス+ステップ長です.ポインタのタイプがステップ長を決定します.
配列a[8]が定義され、a,&a,&a[0]はいずれも配列の開始アドレスである.しかし、ステップ長には違いがあります.つまり、指向のタイプが違います.
aはa+0と&a[0]に等しく、配列の最初の要素を指すポインタであり、ステップ長が指す要素が占有するアドレス空間はsizeof(int)である.
&aも配列の最初の要素を指すポインタですが、配列全体のヘッダアドレスを指すことを意味し、配列全体を指すタイプなので、そのステップ長は8*sizeof(int)です.
2.aのタイプはint*
&aのタイプはint**
&a+1は、4つの位置を移動し、4の次の位置を指します.
ptrも8の次の位置を指し、
ptrはint*,ptr-1は8を指す位置を移動する
つまり出力の結果は8
#include 
#include 
#define MAX(a,b,c) ((a+b)>c)?1:0
int main()
{
     int a[8]={1,2,3,4,5,6,7,8};
     int *ptr=(int*)(&a+1);
     printf("%d %d %d %d %d %d
",a,&a,&a[0],a+1,&a+1,&a[0]+1);      printf("%d  %d
",*(ptr-1),*ptr);     return 0; }

実行結果:
-1672731376 -1672731376 -1672731376 -1672731372 -1672731344 -16727313728  4195792