簡體   English   中英

有關函數指針的C問題

[英]C question regarding pointers in a function

關於此代碼,我有兩個問題。

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

是的-類型是三重指針或指向指針的指針。 有時它們是必要的,但非常害怕。 在這種情況下,您要分配兩個大小相似的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;
};

等等。

A)A ***可以是指向指針數組的指針,也可以是二維數組的指針
B)int和double是不同的類型,沒有強制轉換就無法運行

double *** pdata和int *** pmask是什么意思? 指向指針的指針?

是。

[何時]這是必要的?

像此函數一樣,當您希望按指針返回指針到指針的值時。 您當然也可以按值返回這些,但是此函數通過指針完成,因為它“返回”了多個指針。

int和double是不同的類型,但是double *和int *也不同。 我們可以在沒有演員的情況下對其進行操作嗎?

我不確定您的意思,但是您不能期望將int*double* ,反之亦然; 對於相同的值(只要它們可以表示相同的值)和大小, intdouble很有可能在內存中具有不同的表示形式。 您還會說出違反C的“嚴格別名”規則

double *p = WHATEVER;
int *q = p;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM