2009-07-16 4 views
4

... без использования typedef.Как бы вы объявили двумерный массив указателей в C?

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

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

+5

'int * array [10] [10];' – avakar

+1

Итак, с какого типа typedefs плохой стиль? Я хочу увидеть имена людей, которые отвечали за эту идею на моем столе завтра. –

+1

Авакар ... просто прав, я не понимаю смысла этого вопроса. Возможно, прошло уже более 10 лет, так как ваш босс на самом деле запрограммирован на C, и он слабо помнит об этом как о трудном? Или есть какая-то часть «проблемы», которую вы забыли включить? – unwind

ответ

6
void* array[m][n]; 

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

2
void*** p2DArray = (void***)malloc(numAxis1 * sizeof(void**)); 

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

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

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

определений типов

Edit: Хахаха или что avakar предложил;)

+1

В C вы никогда не должны бросать возврат malloc(). – unwind

+1

@unwind: Вы никогда не должны бросать возвращение malloc? Таким образом, вы не можете выделить ничего, кроме void *, который бесполезен сам по себе? – OregonGhost

+0

Nah char * pChar = malloc (1); это правильный код, если я правильно помню. Кажется, я не помню, что был какой-то вред при возврате malloc ... но я использую C++ больше, чем C. – Goz

0

Массив строки в C/C++, майор столбца в Matlab/Fortran и по неизвестной причине C#/native interop с многомерными массивами.

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

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

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

6

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 

Если мы говорим о указателях на 2D массивов, то вещи только получить немного более интересными:

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 

Edit: подождите, я думаю, что я могу получать то, что вы после этого.

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

Edit: Теперь мы получаем действительно глупо:

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 

для определения типов являются wusses.

+1

«Typedefs для wusses». LOOOOOL –

+0

До голосования это чисто для вышеуказанной цитаты. – RedLeader