我对此代码有两个问题。
double*** pdata
和int*** pmask
是什么意思?指向指针指针的指针?
为什么或何时有必要?
int
和double
是不同的类型,但double*
和int*
也不同。我们可以在没有演员阵容的情况下对他们进行操作吗?
这是我困惑的代码:
static int makedatamask(int nrows, int ncols, double*** pdata, int*** pmask)
{ int i;
double** data;
int** mask;
data = malloc(nrows*sizeof(double*));
if(!data) return 0;
mask = malloc(nrows*sizeof(int*));
if(!mask)
{ free(data);
return 0;
}
for (i = 0; i < nrows; i++)
{ data[i] = malloc(ncols*sizeof(double));
if(!data[i]) break;
mask[i] = malloc(ncols*sizeof(int));
if(!mask[i])
{ free(data[i]);
break;
}
}
if (i==nrows) /* break not encountered */
{ *pdata = data;
*pmask = mask;
return 1;
}
*pdata = NULL;
*pmask = NULL;
nrows = i;
for (i = 0; i < nrows; i++)
{ free(data[i]);
free(mask[i]);
}
free(data);
free(mask);
return 0;
}
答案 0 :(得分:1)
是 - 类型是三指针或指向指针的指针。偶尔他们是必要的,但要非常害怕。在这种情况下,您要分配两个大小相似的2D数组,并且必须通过引用返回这两个值,因此三重指针是必要的,至少在保持当前函数设计时是这样。
是的 - double *
和int *
是不同的类型;他们指向不同的类型。你可以在没有演员的情况下对它们进行适当的操作但是,如果您认为可以将两个并行操作合并为一个,则可能会出错。
如果您创建了一些子功能,您的错误恢复可能会更简单:
static int **alloc_2d_int_array(int nrows, int ncols)
{
...
}
static double **alloc_2d_double_array(int nrows, in ncols)
{
...
}
然后,您的主要分配功能将依次调用这两个。如果第二个失败,主分配函数将调用第一个分配的数组的清理。清理代码可能需要相关的大小,所以你可能有:
static void free_2d_double_array(int nrows, double **array)
{
...
}
static void free_2d_int_array(int nrows, int **array)
{
...
}
这些功能甚至可能在源外可见(不是static
)。
您也可以考虑使用结构来描述数组(行和列)以及指向数组的指针。这样你就可以避免显式的三指针表示法了。
struct double_array
{
int nrows;
int ncols;
double **array;
};
等
答案 1 :(得分:1)
A)***可以是指向指针数组的指针,也可以是指针的双维数组 B)int和double是不同的类型,没有强制转换就无法运行
答案 2 :(得分:1)
double *** pdata和int *** pmask是什么意思?指向指针指针的指针?
是
[何时]这是必要的?
当像这个函数那样,你希望通过指针返回一个指向指针的指针值。您当然也可以通过值返回这些值,但是这个函数通过指针执行它,因为它“返回”多个指针。
int和double是不同的类型,但是double *和int *也是不同的。我们可以在没有演员表的情况下对他们进行操作吗?
我不确定你的意思,但你不能指望将int*
投射到double*
,反之亦然; int
和double
很可能在内存中对相同的值(只要它们可以表示相同的值)和不同的大小具有不同的表示。你也可以通过说
double *p = WHATEVER;
int *q = p;