Многомерный массив и указатель на указатели
Когда вы создаете многомерный массив 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-элементного массива char
Msgstr "В соответствии с приведенным выше правилом указатель на тип" покрывается указателем на массив из 10 элементов char
", или же char (*)[10]
,
Помните, что в контексте объявления параметров функции T a[N]
а также T a[]
идентичны T *a
; Таким образом, T a[][10]
идентично T (*a)[10]
,