Многомерный массив и указатель на указатели

Когда вы создаете многомерный массив char a[10][10]Согласно моей книге говорится, что вы должны использовать параметр, аналогичный char a[][10] передать массив в функцию.

Почему вы должны указать длину как таковую? Разве вы не просто передаете двойной указатель на то, чтобы быть с, и разве этот двойной указатель уже не указывает на выделенную память? Так почему же параметр не может быть char **a? Вы перераспределяете любую новую память, снабжая вторым 10.

2 ответа

Решение

Указатели не являются массивами

Разыменованный char ** является объектом типа char *,

Разыменованный char (*)[10] является объектом типа char [10],

Массивы не указатели

Смотрите запись в c-faq об этой теме.


Предположим, у вас есть

char **pp;
char (*pa)[10];

и, ради аргумента, оба указывают на одно и то же место: 0x420000.

pp == 0x420000; /* true */
(pp + 1) == 0x420000 + sizeof(char*); /* true */

pa == 0x420000; /* true */
(pa + 1) == 0x420000 + sizeof(char[10]); /* true */

(pp + 1) != (pa + 1) /* true (very very likely true) */

и именно поэтому аргумент не может быть типа char**, Также char** а также char (*)[10] не являются совместимыми типами, поэтому типы аргументов (разрушенный массив) должны соответствовать параметрам (тип в прототипе функции)

Стандарт языка C, черновик n1256:

6.3.2.1 L-значения, массивы и обозначения функций
...
3 За исключением случаев, когда это операнд sizeof оператор или унарный & оператор или строковый литерал, используемый для инициализации массива, выражение с типом '' массив типа'' преобразуется в выражение с типом '' указатель на тип'', которое указывает на начальный элемент объекта массива и это не lvalue. Если объект массива имеет класс хранения регистров, поведение не определено.

Учитывая декларацию

char a[10][10];

тип выражения массива a это "10-элементный массив из 10-элементного массива charMsgstr "В соответствии с приведенным выше правилом указатель на тип" покрывается указателем на массив из 10 элементов char", или же char (*)[10],

Помните, что в контексте объявления параметров функции T a[N] а также T a[] идентичны T *a; Таким образом, T a[][10] идентично T (*a)[10],

Другие вопросы по тегам