ここに私は4つの整数のptr
配列へのポインターがarr
あります。ptr
配列全体を指します。ptr[0]
または*ptr
配列の最初の要素を指すため、1を追加して配列ptr[0]
の2番目の要素のアドレスを取得します。
sizeof(ptr[0])
(ptr[0]
配列の最初の要素へのポイントとして)最初の要素のみのサイズである4バイトではなく、配列全体のサイズが16バイトになる理由を理解できません。
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
か? 実は違う。 4つの値の完全な配列へのポインタとしてint (*ptr)[4]
作成ptr
しint
ます。このようなポインタ構文は、真の多次元配列を動的に割り当てるために必要です。ネストされたmalloc()
ループで作成され、多次元配列として誤って記述された「2次元配列」は、実際には複数の1次元配列へのポインターの1次元配列です。stackoverflow.com/questions/42094465/…を
int *ptr = arr;
か?これにより、配列の先頭(最初の要素)を指すようになり&arr[0]
ます。これはと同等です。