显而易见的解决方案是将数组作为指针而不是双指针传递:
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**) 而不是双精度值。我认为这不容易奏效。首先,一个名为 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);
......但是,这又是丑陋的,不安全的,而且实际上做起来也无济于事。为您想做的工作使用正确的类型要好得多。