Вопрос был
"Почему *ptr
возвращает базовый адрес массива, не должен ли он возвращать значение по этому адресу?"
Он возвращает значение по этому адресу, которое массив arr
.
Подумайте об очереди людей: вы можете указать на первого человека и сказать «этот человек там», или вы можете указать на того же человека и сказать «эта очередь там». В одном месте есть 2 вещей: человек и очередь. То же самое происходит с массивами: person *
для этого "человека там" и person (*)[42]
"для этой очереди из 42 человек". Если вы разыменуете указатель на очередь, вы получите очередь. Если вы берете первое из очереди, вы получаете человека.
Но , тогда сам массив будет уменьшаться до адреса до первого элемента, если он задан в качестве аргумента printf
. Таким образом, здесь
int arr[] = { 3, 5, 6, 7, 9 };
int (*ptr)[5] = &arr;
// undefined behaviour really, all pointers should be cast to void *
printf("%p %p %p %p", *ptr, &ptr[0], arr, &arr[0]);
все эти 4 выражения приведут к указателю на int
, а значением является адрес первого элемента в массиве (адрес 3 в arr
).