Разница между двойной ** и двойной (*) [2] в C - PullRequest
4 голосов
/ 09 марта 2012

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

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

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

Например, в:

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

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

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

Как правильно передать значение типа double (*) [2] в функцию?

РЕДАКТИРОВАТЬ: телефонный код

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

pcmTocomplex(data, in);

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

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

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

2 голосов
/ 09 марта 2012

Вам необходимо изменить второй тип параметра на это:

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

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

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

1 голос
/ 09 марта 2012
void pcmTocomplex(short *data, double *outm[2])

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...