int arr[SIZE] = { 1, 2, 3, 4, 5 };
printf("%zd\n", sizeof(*(arr + 0))); // 4
printf("%zd", sizeof(arr)); // 20
Как sizeof вычисляет размер массива, если передавая функции имя массива, по факту передается указатель на первый элемент, в данном случае sizeof получает указатель на int (sizeof (int) == 4). Откуда функция узнает количество элементов? По идеи при передаче sizeof указателя, должен возвращаться размер этого указателя (в моем случае 8).
sizeof(&arr[0]) == 8.
Как это все работает если // &arr[0] == arr
Выводят один и тот же адрес:
printf("%p\n", &arr[0]);
printf("%p\n", arr);
А вот если вызывать sizeof с этими значениями то будет разные результаты.
printf("%zd\n", sizeof(&arr[0])); // Выводится размер указателя
printf("%zd\n", sizeof(arr)); // Выводится размер всего массива, хотя и то и то являются адресами первого элемента