1

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

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

我对(*图像)感到困惑

如果我要定义一个指向 RGBTRIPLE 的指针,我想我会使用:

RGBTRIPLE *image[width] = ....

是否与以下内容相同:

RGBTRIPLE(*image)[width] = ....   ?
4

2 回答 2

3
RGBTRIPLE *image[width]; 

是一个指向 的指针数组RGBTRIPLE,该数组将包含width多个元素。这个数组中的每个指针都能够指向一个RGBTRIPLE对象,这使得当每行有几个这样的对象时可以拥有一个二维数组。

分配更加混乱,因为您需要自己分配指针数组,然后分配每个指针指向的每一行,然后以相反的顺序释放内存。


RGBTRIPLE(*image)[width];

是指向数组的指针RGBTRIPLE,该数组必须有width多个元素,在这种情况下,您可以使用它指向具有任意行数的二维数组,只要它具有width列数即可。

这是实现二维数组的更好方法,因为它有助于分配和解除分配。

这通过允许它width通过增加它来移动字节大小的块中的指针来工作,实际上它让你通过增加一次指针来“跳转”到下一行。

例如,一个由 6 个width和 2 个组成的数组height

             +-----------+
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);
于 2020-08-23T23:17:14.697 回答
1

这些不一样。

RGBTRIPLE *image[width]

这表示一个大小数组,width其元素类型为RGBTRIPLE *,即它是一个指针数组。

RGBTRIPLE(*image)[width]

width这是一个指向其成员类型为 的大小数组的指针RGBTRIPLE

两者都可用于实现二维数组,但方式不同。如果您使用前一个声明,则必须按如下方式分配额外维度:

int i;
for (i=0; i<width; i++) {
    image[i] = calloc(height, sizeof(RGBTRIPLE));
}
于 2020-08-23T22:47:40.647 回答