sách gpt4 ai đã đi

关于函数中指针的 C 题

In lại 作者:太空宇宙 更新时间:2023-11-04 07:38:22 28 4
mua khóa gpt4 Nike

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

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

  2. số nguyêngấp đôi 是不同的类型,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);
trả về 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]);
phá vỡ;
}
}
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);
trả về 0;
}

1 Câu trả lời

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

是的 - 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)
{
...
}

这些函数甚至可能在源代码之外可见(不是tĩnh).

您还可以考虑使用结构来描述数组(行和列)以及指向数组的指针。这也可以让您避免显式的三重指针表示法。

struct double_array
{
int nrows;
int ncols;
double **array;
};

vân vân.

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

28 4 0
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com