Здесь у меня есть указатель ptr
на массив arr
из 4 целых чисел. ptr
указывает на весь массив. ptr[0]
или *ptr
указывает на первый элемент массива, поэтому добавление 1 к ptr[0]
дает адрес второго элемента массива.
Я не могу понять, почему использование sizeof(ptr[0])
дает размер всего массива, 16 байтов, а не размер только первого элемента, 4 байта, (как ptr[0]
указывает на первый элемент в массиве).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? Вообще-то, нет. int (*ptr)[4]
создает ptr
как указатель на полный массив из четырех int
значений. Подобный синтаксис указателя необходим для динамического выделения многомерных массивов. «2-мерные массивы», созданные с помощью вложенных malloc()
циклов и ошибочно описанные как многомерные массивы, на самом деле являются 1-мерными массивами указателей на несколько 1-мерных массивов. См. Stackoverflow.com/questions/42094465/…
int *ptr = arr;
? Это указало бы на начало (первый элемент) массива, что эквивалентно&arr[0]
.