typedef многомерного массива? - PullRequest
5 голосов
/ 09 января 2012
typedef int array [x][];

Что это значит.Что будет, если у нас будет такой typedef.Это был мой вопрос на собеседовании.

Ответы [ 3 ]

8 голосов
/ 09 января 2012

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

#define x 3

Как указывают другие, typedef int array [3][]; не будет компилироваться.Вы можете опустить только самый значимый (т.е. первый) элемент длины массива.

Но вы можете сказать:

typedef int array [][3];

Это означает, что arrayмассив int (пока не определенной длины) массива длиной 3.

Чтобы использовать его, необходимо указать длину.Вы можете сделать это с помощью инициализатора следующим образом:

array A = {{1,2,3,},{4,5,6}};   // A now has the dimensions [2][3]

Но вы НЕ МОЖЕТЕ сказать:

array A; 

В этом случае первое измерение A не являетсяуказан, поэтому компилятор не знает, сколько места для него выделено.

Обратите внимание, что также хорошо использовать этот тип array в определении функции - поскольку массивы в определениях функций всегда преобразуются в указателиих первый элемент компилятором:

// these are all the same
void foo(array A);
void foo(int A[][3]);
void foo(int (*A)[3]); // this is the one the compiler will see

Обратите внимание, что в этом случае:

void foo(int A[10][3]); 

Компилятор все еще видит

void foo(int (*A)[3]);

Итак, 10 часть A[10][3] игнорируется.

В итоге:

typedef int array [3][]; // incomplete type, won't compile
typedef int array [][3]; // int array (of as-yet unspecified length) 
                         // of length 3 arrays
3 голосов
/ 09 января 2012

Вы получите ошибку компиляции. Для многомерных массивов самое большее первое измерение может быть опущено. Так, например, int array[][x] будет правильным вместо

1 голос
/ 09 января 2012

Вы получите диагностику.

int [x][] - это неполный тип массива, который нельзя заполнить.

...