Почему sizeof показывает фактический размер массива хотя по сути имя массива это указатель на первый элемент?
По сути статический массив это действительно указатель. Но реально тип другой и компилятор знает реальный размер массива. После того как вы приводите массив к типу указателя (например при передаче в функцию), эта информация теряется и sizeof уже вернет размер указателя.
Несмотря на то, что массив часто отождествляют с указателем, массив — это НЕ указатель. У него, например, другие операции приводят к неопределённому поведению.
И самое противное в Си — это то, что в кодеvoid sort(int x[5]);
x — это не массив, а именно что указатель. Чтобы был массив, надо Си++void sort(int (&x)[5]);
И компилятор даже подсвечивает, что параметр функции, отмеченный как массив — всегда указатель.typedef int Arr[SIZE];
int sum(Arr arr, int n)
// warning: 'sizeof' on array function parameter 'arr' will return size of 'int *' [-Wsizeof-array-argument]|