Массивы и указатели в Си тесно связаны и могут быть использованы почти эквивалентно. Имя массива можно понимать как константный указатель на первый элемент массива. Его отличие от обычного указателя только в том, что его нельзя модифицировать.
Указатели можно использовать для выполнения любой операции, включая индексирование массива.
Между именем массива и соответствующим указателем есть одно важное различие. Указатель - это переменная и у = а или y++ - допустимые операции. Имя же массива - константа, поэтому конструкции вида a = y, a++ использовать нельзя, так как значение константы постоянно и не может быть изменено.
В языке Си имя массива - это адрес памяти, начиная с которой расположен массив, то есть адрес первого элемента массива. Если объявлен целочисленный массив int m[25] , то m является указателем на массив. Поэтому написать в программе
p=m; или
p=&m[0]
это одно и то же, так как первая и вторая команды дают одно и то же число - адрес первого элемента массива m[25]. Для того, чтобы обратиться к 11-му элементу массива m, можно написать m[10] или *(m+10). Результат должен быть одним и тем же.
Преимущество использования способа *(p+10) состоит с том, что арифметические операции над указателями выполняются быстрее, если Вы работаете с подряд идущими элементами массива.
Когда массив используется в качестве аргумента функции, передается только адрес массива, а не копия всего массива. При вызове функции с именем массива в функцию передается указатель на первый элемент массива. Параметр должен иметь тип, совместимый с указателем.
Важно понять, что при использовании массива в качестве аргумента функции происходит передача в функцию его адреса. Это означает, что код внутри функции действует и может изменять настоящее значение массива, используемого при вызове.
Если двумерный массив создан динамически, то можно передавать указатель на указатель.