我正在使用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中基本相同,这只是一个警告,我应该忽略它,还是应该在我的代码中修复一些东西? 提前致谢
答案 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_Solver
和Delta_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?