Имена массивов и указатели
В Си разница между именем одномерного массива и указателем на тип элементов этого массива проявляется в двух случаях:
1. Использование имени массива в роли указателя.
Имена массивов трактуются компилятором как адреса, а именованные адреса в Си называются указателями.
Обычно под указателем понимают переменную, т.е. объект, который при выполнении программы может изменить свое значения. Для изменения значения переменная должна быть помещена в левую часть оператора присваивания (использоваться как l-value).
Но имена массивов — это особый тип указателей. Они обозначают адрес, который меняться не может (указатель-константа). Поэтому имена массивов (без индексов) могут появляться только в правых частях выражений (использоваться только, как r-value)
Пример 1.
В программе определены одномерный массив и указатель, который инициализируется адресом массива.
int arr[12], *pa=arr;
arr++ ; /* Ошибка! Объяснить, почему? */
pa++; /* Правильно */
2. Использование имени массива для вычисления размер объекта.
Результатом применения операции sizeof к имени массива будет размер отведенной массиву памяти (в байтах).
Если применить операцию к однотипному с массивом указателю (pa), то будет вычислен размер указателя, т.е. объем памяти, используемый в программе для хранения адреса.