问题描述
在某些入门代码中,我们有:
/**
* RGBTRIPLE
*
* This structure describes a color consisting of relative intensities of
* red,green,and blue.
*
* Adapted from http://msdn.microsoft.com/en-us/library/aa922590.aspx.
*/
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
在我们的主程序中,我们有:
RGBTRIPLE(*image)[width] = calloc(height,width * sizeof(RGBTRIPLE));
我对(* image)感到困惑
如果我要定义一个指向RGBTRIPLE的指针,我想我会使用:
RGBTRIPLE *image[width] = ....
与以下相同:
RGBTRIPLE(*image)[width] = .... ?
解决方法
RGBTRIPLE *image[width];
是指向RGBTRIPLE
的指针的数组,该数组将包含width
个元素。该数组中的每个指针都可以指向RGBTRIPLE
对象,当每行有多个这些对象时,就可以拥有2D数组。
分配是比较麻烦的,因为您需要先分配指针数组本身,然后分配每个指针将指向的每一行,然后再以相反的顺序释放内存。
RGBTRIPLE(*image)[width];
是指向RGBTRIPLE
数组的指针,该数组必须具有width
个元素,在这种情况下,您可以使用它指向具有任意行数的2D数组,只要它具有width
列数。
这是增强2D数组的更好方法,因为它有助于分配和释放。
通过允许它通过递增指针将指针移动到width
个字节大小的块中来工作,实际上,它使您通过递增指针一次来“跳到”下一行。
例如,由width
的6和height
的2组成的数组:
+-----------+
image[0] -> |0|1|2|3|4|5|
+-----------+
|5|4|3|2|1|0|
+-----------+
+-> image[0][4]
|
+-----------+
|0|1|2|3|4|5|
+-----------+
image[1] -> |5|4|3|2|1|0|
+-----------+
|
+-> image[1][4]
表达式:
RGBTRIPLE(*image)[width] = calloc(height,width * sizeof(RGBTRIPLE));
可能会更好,我会使用更安全的方法:
RGBTRIPLE(*image)[width] = calloc(height,sizeof *image);
,
这些不一样。
ObjectMapper mapper = new ObjectMapper();
assertEquals(mapper.readTree(s1),mapper.readTree(s2));
这表示大小为RGBTRIPLE *image[width]
的数组,其元素为width
类型,即它是一个指针数组。
RGBTRIPLE *
这是一个指向大小为RGBTRIPLE(*image)[width]
的数组的指针,其成员的类型为width
。
两者均可用于实现2D数组,但方式不同。如果使用前一个声明,则必须按如下所示分配额外的维度:
RGBTRIPLE