[英]C question regarding pointers in a function
關於此代碼,我有兩個問題。
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;
}
是的-類型是三重指針或指向指針的指針。 有時它們是必要的,但非常害怕。 在這種情況下,您要分配兩個大小相似的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*
,反之亦然; 對於相同的值(只要它們可以表示相同的值)和大小, int
和double
很有可能在內存中具有不同的表示形式。 您還會說出違反C的“嚴格別名”規則
double *p = WHATEVER;
int *q = p;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.