Тип &a
в этом коде - char (*)[100]
, что означает «указатель на массив из 100 символов».
Чтобы правильно создать прототип myfunc
, чтобы принять этот аргумент, вы должны сделать это так:
void myfunc(char (*pa)[100]);
или полностью эквивалентный:
void myfunc(char pa[][100]);
Добавление:
В ответе на дополнительный вопрос в комментариях:
Да, вы будете использовать (*pa)[0]
или pa[0][0]
в myfunc
для доступа к первому элементу массива.
Нет, &a
(и, следовательно, pa
) содержат адрес массива . Они не содержат адрес-адрес. Должно быть очевидно, что адрес массива и адрес его первого элемента совпадают - единственное отличие - это тип. Таким образом, (void *)&a == (void *)a
верно, а (void *)pa == (void *)pa[0]
также верно, даже если это кажется немного не интуитивным.
Рассмотрим эти два объявления:
char (*pa)[100];
char **ppc;
Теперь, хотя pa[0][0]
и ppc[0][0]
оба имеют тип char
, типы pa
и ppc
не эквивалентны. В первом случае промежуточное выражение pa[0]
имеет тип char [100]
, который затем оценивает указатель на первый элемент в этом массиве типа char *
. Во втором случае промежуточное выражение ppc[0]
уже является char *
.