Язык Си не допускает копирования всего массива для передачи его в функцию. Тем не менее, функции можно передавать элемент массива или начальный адрес массива.
Адрес массива — адрес первого элемента массива.
Для того, чтобы функция имела доступ к массиву, ей достаточно передать адрес массива.
Пример 1
/* Копирует массив с использованием функции */
int main( )
{
void stringcopy (char[], char[]);
char current[30], target[30];
. . .
stringcopy(current, target);
. . .
}
/* Копирует str1 в str2 */
void stringcopy(char str1[], char str2[])
/* str1 = 600 str2 = 500 */
{
int i;
for ( i = 0; str2[i]!='\0'; i++)
   str1[i]=str2[2];                   /* адрес[смещение] */
str1[i]='\0';
}
Выражение типа str2[i] интерпретируется так, что означает адрес[смещение].
Если в вызове функции в качестве фактического параметра используется имя массива без скобок, то значением этого параметра будет начальный адрес массива. Если в примере начальные адреса массивов current и target равны соответственно 600 и 500, то в момент вызова функции stringcopy() значения формальных параметров str1 и str2 будут равны соответственно 600 и 500. Зная эти адреса, функция stringcopy() может обращаться к элементам массива, используя операцию доступа к элементу массива []. Выражение current[3], так и str2[3] будут интерпретированы как 500[3]. Доступ выполняется к значению, находящемуся по адресу:

В примере 2 показаны два способа объявления параметров функции при передаче адреса массива:
Пример 2
int main()
{
int str1[20], str2[20];
void array_cpy(char[], char[]);
void ptr_cpy(char*, char*);
...
array_cpy(str1, str2);
/*ptr_cpy(str1, str2);*/
...
}
void array_cpy(char one[], char two[])
{
int i;
for (i = 0; two[i]!='\0'; i++)
   one[i]=two[i];
one[i]='\0';
}
В функции array_cpy() формальные параметры объявляются с использованием операции доступа к элементу массива []. Эта же операция применяется и в теле функции.
void ptr_cpy(char *one, char *two)
{
for ( ; *two!='\0'; one++, two++)
   *one=*two;
*one='\0';
}
В функции ptr_cpy() формальные параметра объявляется как указатели. В теле функции используется операция косвенного доступа *. Такая совместимость объявлений и операций настоятельно рекомендуется по стилевым причинам, но она не является необходимой. Тела двух функций можно без ущерба поменять местами. Важно помнить, что доступ к данным, хранящимся по адресу, обеспечивают обе операции * и []. Операцию * можно применять даже к имени массива. В действительности, выражение array_name[i]преобразуется компилятором в выражение *(array_name + i).