мы можем объявить функцию в заголовочном файле следующим способом?
extern int ap( char[][] );
мы можем использовать символ [] [] в функции?
Для двумерного массива вы должны указать размер последнего измерения, иначе компилятор не знает, как его использовать. (хотя имя можно не указывать.)
вот так:
extern int ap( char[][10] );
Нет, вам нужно указать последние измерения N-1 для массива.
extern int ap( char[][DIMENSION] );
Дополнительную информацию см. здесь
char [] []
не является допустимым типом массива, потому что у вас не может быть массивов неполного типа, и char []
является неполным. Я знаю, что это сбивает с толку, потому что у вас действительно два типа массивов, поэтому вот еще один пример с той же проблемой: char a [3] []
. Массив a имеет длину 3 и тип элемента char []
, но char []
, опять же, неполный, и это недействительно .
Когда у вас есть «многомерный массив», у вас действительно есть массив массивов. Например, typedef int U [3] [5];
превращает U в массив длиной 3 массивов длиной 5 целых чисел и эквивалентен typedef int H [ 5]; typedef H U [3];
.
Причина, по которой вы можете опустить крайнее левое измерение с параметрами функции, заключается в том, что только с параметрами функции , типы массивов формы T [N]
преобразуются в T *
и N могут быть опущены, что дает от T []
до T *
. Это применимо только к «самому верхнему» или «самому внешнему» уровню.
Итак, все эти объявления функций идентичны:
int f1(int a[3][5]);
int f2(int a[][5]);
int f3(int (*a)[5]);
typedef int T[5];
int f4(T a[3]);
int f5(T a[]);
int f6(T* a);
Вы, конечно, можете удалить имя параметра a в любом из вышеупомянутых объявлений, не изменяя их.
Тем не менее, вполне допустимо опускать имена параметров в объявлениях функций. Однако, когда вы определяете функцию, вы должны дать массиву имя, и тогда вы можете ссылаться на него по этому имени.
Нет, это недопустимо - это попытка объявить параметр как указатель на неполный тип массива.
Тип массива должен быть дополнен размером, например, так:
extern int ap( char[][10] );