在C中定义类型时对指针语法感到困惑

问题描述

在某些入门代码中,我们有:

 /**
 * 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