配列のアドレス+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
実行結果:
-1672731376 -1672731376 -1672731376 -1672731372 -1672731344 -16727313728 4195792
配列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