gpt4 book ai didi

关于函数中指针的 C 题

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:22 28 4
gpt4 key购买 nike

我有两个关于这段代码的问题。

  1. double*** pdataint*** pmask 是什么意思?指向指针的指针?为什么或何时需要这样做?

  2. intdouble 是不同的类型,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;
}

最佳答案

是的——类型是三重指针或指向指针的指针。有时他们是必要的,但要非常害怕。在这种情况下,您正在分配两个大小相似的二维数组,并且您必须通过引用返回这两个值,因此三重指针是必需的,至少在您保持当前函数设计的同时。

是的 - 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;
};

等等

关于关于函数中指针的 C 题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6948112/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com