明らかな解決策は、配列をダブルポインターとしてではなく、ポインターとして渡すことです。
double sum(double *A, double *B, int M, int N)
{
double ret = 0.0;
for (int i=0; i<M; i++) ret += A[i];
for (int j=0; j<N; j++) ret += B[j];
return ret;
}
double a[] = {5.34, 5.23, 6.5, 3.51};
double b[] = {74.3, 42.1, 642.2, 54.2};
double s = sum( a, b, 4, 4);
printf("The sum is %f\n", s);
...それを行うのが最も簡単なことです。ただし、既存のAPIによって、ダブルポインターを使用する関数シグネチャに制約されている場合は、APIが、呼び出された関数が渡されたポインターを変更できるようにする必要があるためである可能性があります。ポインターからポインターへの受け渡しにより、呼び出された関数は、必要に応じて、ポインターからポインターへの書き込みを行うことができます。
double sum_and_change_pointers(double ** A, double ** B, int M, int N)
{
// Compute sum
double ret = 0.0;
for (int i=0; i<M; i++) ret += (*A)[i];
for (int j=0; j<N; j++) ret += (*B)[j];
// And just for fun, modify the caller's pointer-values too
static double some_other_array[5] = {0,0,0,0,0};
*A = some_other_array;
*B = some_other_array;
return ret;
}
このようなシナリオでは、関数は次のように呼び出されます。
double a[] = {5.34, 5.23, 6.5, 3.51};
double b[] = {74.3, 42.1, 642.2, 54.2};
double * pa = a; // copy address of arrays into pointers
double * pb = b; // because changing the address of an array itself wouldn't work
printf("Before calling sum_and_change_pointers, pa=%p and pb=%p\n", pa, pb);
double s = sum_and_change_pointers( &pa, &pb, 4, 4);
printf("After calling sum_and_change_pointers, s=%f, pa=%p and pb=%p\n", s, pa, pb);
別の注意:投稿されたコードでは、関数がdoubleではなく(double **)を返します。それは簡単には機能しないと思います。まず、sumという名前の関数は、おそらくポインターからポインターではなく、倍精度浮動小数点値を返すので、(double **)を返すのは意味がありません...しかし(何らかの理由で)そのようにしたい場合でも、返されたポインタへのポインタがメモリ内の有効な場所を指していること(およびその場所が関数が戻ると関数のローカル変数がすべてなくなるため、関数内から行うのは難しいため、メモリ内の有効な場所も)。スレッドセーフを失うことを気にしないのであれば、静的変数またはグローバル変数でそれを行うことができると思います。
double ** sub (double ** A, double ** B, int M, int N)
{
// Compute sum
double ret = 0.0;
for (int i=0; i<M; i++) ret += (*A)[i];
for (int j=0; j<N; j++) ret += (*B)[j];
static double result;
result = ret;
static double * pointerToResult;
pointerToResult = &ret;
return &pointerToResult;
}
[...]
double ** s = sum( a, b, 4, 4);
printf("Sum's result was %f\n", **s);
...しかし、繰り返しますが、これは醜く、安全ではなく、実際に行うのは役に立ちません。やりたい仕事に正しいタイプを使用する方がはるかに良いです。