不兼容的指针类型警告&更新函数中的现有数组

时间:2018-05-21 22:33:39

标签: c arrays pointers

我正在使用C进行数值模拟,并且(为了简化代码)我决定使用void函数来更改现有数组中的值,而不是编写多个函数或定义结构。

感谢这个网站上的一个问题,我了解到我可以通过给函数指定指针作为参数来实现这一点,我这样做并试图让它以这种方式工作,例如:

void initialization_1(double *x, double **A, double **delta, double **Phi, double **Pi){
    int i;
    for(i=0;i<SIZE;i++){
        (*Phi)[i]=0.0;
        (*Pi)[i]=2.0*eps*exp(-(4.0*pow(tan(x[i]),2.0))/pow(M_PI*sigma,2))/M_PI;
    }
    *A=A_Solver(x, *Phi, *Pi);
    *delta=Delta_Solver(x, *Phi, *Pi);
}

我以这种方式称呼它:

int main(){
    double* x=initialize_x();
    double h=x[1];
    double A[SIZE];
    double delta[SIZE];
    double Phi[SIZE];
    double Pi[SIZE];
    initialization_1(x, &A, &delta, &Phi, &Pi);
    return 0;
}

当我尝试编译它时编译,但是给了我一系列这种类型的警告:

warning: passing argument 2 of 'initialization_1' from incompatible pointer type [-Wincompatible-pointer-types]|
note: expected 'double **' but argument is of type 'double (*)[4096]'|

(编译器是gcc)

我很困惑,我认为指针和数组在C中基本相同,这只是一个警告,我应该忽略它,还是应该在我的代码中修复一些东西? 提前致谢

2 个答案:

答案 0 :(得分:3)

不,数组和指针不相等。 &array将给出一个指向数组的指针;但是你的函数需要一个指向指针的指针。

然而,似乎这些都不需要任何间接;您可以将参数类型设置为double *,然后传入数组:

void initialization_1(double *x, double *A, double *delta, double *Phi, double *Pi){
    int i;
    for(i=0;i<SIZE;i++){
        Phi[i]=0.0;
        Pi[i]=2.0*eps*exp(-(4.0*pow(tan(x[i]),2.0))/pow(M_PI*sigma,2))/M_PI;
    }
    A_Solver(x, Phi, Pi, A);
    Delta_Solver(x, Phi, Pi, delta);
}

....

initialization_1(x, A, delta, Phi, Pi);

但是你需要更改A_SolverDelta_Solver - 这些应该将指向结果数组的第一个元素的指针作为参数。

答案 1 :(得分:1)

无需为此指针传递指针。相反,做:

void initialization_1(double *x, double *A, double *delta, double *Phi, double *Pi)
{
    Phi[i] = ...;
}

并将其命名为:

initialization_1(x, A, delta, Phi, Pi);

为了更好地理解数组,指针及其地址之间的关系,您可能需要阅读:How come an array's address is equal to its value in C?