2012-03-09 6 views
2

double **とdouble(*)[2]の違いは何ですか?Cのdouble **とdouble(*)[2]の相違

私がよく理解していれば、double **はdouble型のポインタへのポインタです。したがって、double型(*)[2]はdouble型の配列へのポインタです]。

それが正しい場合、どのように正常に関数に渡すことができます。渡すための正しい方法は何ですか

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

:で例えば

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

私は(*)doubleを渡した場合、[2]のパラメータとして、私は次の警告を持っています二重(*)[2]関数に?

EDIT:あなたは、この2番目のパラメータの種類を変更する必要があるコード

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

[comp.lang.c FAQ](http://c-faq.com/)のセクション6を読んでください。 –

答えて

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

この2つ目のパラメータは、あなたが望むものを実際にダブルポインタの配列を意味するものではありません。

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

あなたが望むなら、これはどのように見えますか?

2

を呼び出す:

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

2番目のパラメータがdouble (*outm)[2]に変更されます。

また、パラメータ内のdouble *outm[2]は、であり、正確にはであり、double **outmと同じです。

3

double *outm[2]は、double (*outm)[2]と同じではありません。最初のものはポインタの配列です(この文脈ではdouble **に相当します)。 2番目は配列へのポインタです。

疑わしい場合は、cdeclを使用してください。あなたはこの関数のプロトタイプで見

関連する問題