Как бы вы объявили двумерный массив указателей в C? - PullRequest
4 голосов
/ 16 июля 2009

... без использования typedef.

Мой босс утверждает, что его однажды спросили об этом в интервью, и когда он дал свой ответ, интервьюеры сказали ему, что он не может использовать typedefs, потому что это был плохой стиль.

Несмотря на это, ему нравится задавать вопрос людям просто для того, чтобы посмотреть, могут ли они сделать это правильно, обычно на новых программистских обедах. Никто никогда не понимает это правильно (особенно без ручки, бумаги или компьютера). Я хочу быть готовым в следующий раз, когда он попытается поставить кого-то в тупик>: D

Ответы [ 5 ]

9 голосов
/ 16 июля 2009

2D массив указателей на что?

T *p[N][M];     // N-element array of M-element array of pointer to T
T (*p[N][M])(); // N-element array of M-element array of pointer to 
                // function returning T

Если мы говорим об указателях на двумерные массивы, то все становится немного интереснее:

T a[N][M];            // N-element array of M-element array of T
T (*p)[M] = a;        // Pointer to M-element array of T
T (**p2)[M] = &p;     // Pointer to pointer to M-element array of T
T (*p3)[N][M] = &a;   // Pointer to N-element array of M-element 
                      // array of T
T (**p4)[N][M] = &p3; // Pointer to pointer to N-element array of 
                      // M-element array of T

Редактировать: подождите, я думаю, что я могу получить то, что вы ищете.

T *(*a[N])[M];        // a is an N-element array of pointer to M-element
                      // array of pointer to T

Редактировать: Теперь мы очень глупо:

T *(*(*a)[N])[M];     // a is a pointer to an N-element array of 
                      // pointer to M-element array of pointer to T

T *(*(*(*f)())[N])[M];  // f is a pointer to a function returning
                        // a pointer to an N-element array of pointer
                        // to M-element array of pointer to T

T *(*(*f[N])())[M];     // f is an N-element array of pointer to 
                        // function returning pointer to M-element 
                        // array of pointer to T

А для патологически безумных:

T *(*(*(*(*(*f)())[N])())[M])(); // f is a pointer to a function 
                                 // returning a pointer to a N-element
                                 // array of pointer to function 
                                 // returning M-element array of
                                 // pointer to function returning
                                 // pointer to T

Typedefs для wusses.

6 голосов
/ 16 июля 2009
void* array[m][n];

Даст вам двумерный массив пустых указателей. Я не уверен, что в этом смущения, если я не понял ваш вопрос.

2 голосов
/ 16 июля 2009
void*** p2DArray = (void***)malloc( numAxis1 * sizeof( void** ) );

int count = 0;
while( count < numAxis1 )
{
    p2DArray[count] = (void**)malloc( numAxis2 * sizeof( void* ) );
    count++;
}

А вот и ты. Теперь вы можете получить доступ к массиву, выполнив p2DArray [n] [m] и получить пустоту *, сохраненную там.

Не понимаю, зачем вам вообще нужно использовать typedefs ...

Редактировать: хахахаха или что предложил авакар;)

0 голосов
/ 16 июля 2009

Особенность typedefs и указателей функций заключается в том, что это облегчает умственную нагрузку программистов.

Полагаю, проблема в том, что с помощью указателей void это решится, хотя вам придется разыгрывать FP всякий раз, когда вы его используете, чтобы избавиться от всех предупреждений.

0 голосов
/ 16 июля 2009

Основной ряд в C / C ++, основной столбец в Matlab / Fortran и по неизвестной причине C # / нативное взаимодействие с многомерными массивами.

int x = 4;
int y = 4;
void** data = malloc(x * y * sizeof(void*));
...