Указатели не являются массивами
Разыменованный 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]
не являются совместимыми типами, поэтому типы аргументов (разрушенный массив) должны соответствовать параметрам (тип в прототипе функции)