我写了一段代码但我不知道它是如何工作的。该场景是在读取外部文件的函数中动态分配2D数组
void load_array(double **(&a), int *rows, int *random_val)
{
//I know the number of columns e.g. 3
int i,j;
double temp;
FILE *fp;
//Assign a value to random variable
*random_val=5;
//Read file and determine number of lines(rows) block of code
{
//Code goes here
}
a=(double **)calloc((*rows),sizeof(double *);
for(i=0;i<(*rows);i++)
a[i]=(double **)calloc(2,sizeof(double *); //Only 2 collumns
i=0;
fp=fopen("input","r");
fscanf(fp,"%lf\t%lf\n",&a[0][0],&a[0][1])
while(!feof(fp))
{
i=i+1;
fscanf(fp,"%lf\t%lf\n",&a[i][0],&a[i][1]);
}
*rows=i;
fclose(fp);
}
int main(void)
{
double **A;
int row_count;
double temp;
load_array(A,&row_count, &temp);
return 0;
}
我无法理解以下几点:
for(i=0;i<rows;i++)
而不是for(i=0;i<(*rows);i++)
和random_val=5;
代替*random_val=5;
? **(&a)
作为数组?
此外,我无法理解为什么以这种方式传递数组
(没有&
)。我的指针知识有点受限,我很困惑。请不要提议std::vector
。我想首先澄清这一点。
答案 0 :(得分:2)
您正在混合使用两种语言,因为您通过引用(double **(&a)
)传递指向指针的参数,但您通过calloc
使用C动态分配,而不是new[]
和{{ 1}}。
这只是意味着在尝试编写随机代码之前,您应该阅读一些文档或指南。
如果变量是指针(例如delete[]
),则必须取消引用它(通过int* rows
运算符)以获取其值或为其指定新值。
使用*
声明的变量(仅限C ++)是对现有变量(一种别名)的引用。像&
中一样传递数组意味着您将引用传递给double **(&a)
,它在引擎盖下只是一个指向指针指针(double**
)的指针。在您的示例中,这用于将现有的double***
传递给函数,以使函数初始化数组并将结果地址直接存储在传递的参数中。如果您没有任何特定要求,那么您只需从函数返回double**
而不是使用引用。