Здесь у меня есть указатель 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].