C: Какого типа имя & array_name? - PullRequest
3 голосов
/ 30 ноября 2009

Какой тип &a в следующем коде?

char a[100];
myfunc(&a)

Это даже действительный код? gcc -Wall жалуется на отсутствие прототипа, но в противном случае генерирует код, как если бы был написан myfunc(a).

1 Ответ

15 голосов
/ 30 ноября 2009

Тип &a в этом коде - char (*)[100], что означает «указатель на массив из 100 символов».

Чтобы правильно создать прототип myfunc, чтобы принять этот аргумент, вы должны сделать это так:

void myfunc(char (*pa)[100]);

или полностью эквивалентный:

void myfunc(char pa[][100]);

Добавление:

В ответе на дополнительный вопрос в комментариях:

  1. Да, вы будете использовать (*pa)[0] или pa[0][0] в myfunc для доступа к первому элементу массива.

  2. Нет, &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 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...