关于函数中指针的C问题

时间:2011-08-04 20:27:38

标签: c

我对此代码有两个问题。

  1. double*** pdataint*** pmask是什么意思?指向指针指针的指针? 为什么或何时有必要?

  2. intdouble是不同的类型,但double*int*也不同。我们可以在没有演员阵容的情况下对他们进行操作吗?

  3. 这是我困惑的代码:

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

3 个答案:

答案 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*,反之亦然; intdouble很可能在内存中对相同的值(只要它们可以表示相同的值)和不同的大小具有不同的表示。你也可以通过说

来违反C的“严格别名”规则
double *p = WHATEVER;
int *q = p;