2012-03-09 2 views
2

В чем разница между двойным ** и двойным (*) [2].Разница между двойными ** и двойными (*) [2] в C

Если я хорошо понимаю, double ** является указателем на указатель double, поэтому он может быть 2D-массивом любого размера, тогда как double (*) [2] является указателем на массив double [2 ].

Так что, если это правильно, как можно успешно передать функцию.

Например, в:

void pcmTocomplex(short *data, double *outm[2]) 

, если я прохожу двойной (*) [2] в качестве параметра, у меня есть следующее предупреждение:

warning: passing argument 2 of ‘pcmTocomplex’ from incompatible pointer type 
note: expected ‘double **’ but argument is of type ‘double (*)[2]’ 

Что такое правильный путь, чтобы пройти двойной (*) [2] функции?

EDIT: код вызова

fftw_complex  *in;    /* typedef on double[2] */ 
in = (fftw_complex *) fftw_malloc(sizeof(fftw_complex) * 1024); 

pcmTocomplex(data, in); 
+2

показать нам вызывающий код –

+1

'double * [2]' не совпадает с 'double (*) [2]'. –

+0

Прочтите раздел 6 [comp.lang.c FAQ] (http://c-faq.com/). –

ответ

1
void pcmTocomplex(short *data, double *outm[2]) 

Этот второй параметр, который вы видели в этом прототипе функции, подразумевает массив двойных указателей, а не то, что вы хотите.

void pcmTocomplex(short *data, double (*outm)[2]) 

Это как должно выглядеть, если вы хотите, чего вы ожидаете.

2

Вы должны изменить второй параметр типа этого:

void pcmTocomplex(short *data, double (*outm)[2]) 

Обратите внимание на второй параметр изменяется на double (*outm)[2].

Также обратите внимание, что в вашем коде double *outm[2] в параметре точно такой же, как double **outm.

3

double *outm[2] - это не то же самое, что и double (*outm)[2]. Первый - это массив указателей (и в этом контексте эквивалентен double **); второй - указатель на массив.

Если у вас есть сомнения, используйте cdecl.

Смежные вопросы