CS50第4页笑脸-从许可证采取代码行的含义是什么?

ezykj2lf  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(101)

RGBTRIPLE (*image)[width] = calloc(height, width * sizeof(RGBTRIPLE))我不完全理解代码。我理解的是:

  1. calloc(height, width * sizeof(RGBTRIPLE))-我们在堆内存中的某个地方为某些数据组织了一定大小的空间,并将此内存中的所有值设置为0
  2. RGBTRIPLE (*image)[width]表示变量image是一个指向长度宽度为RGBTRIPLE的数组的指针。
  3. RGBTRIPLE是包含3个变量的数据结构:x一米五氮一xBYTE rgbtRed ;
    为什么没有为两个值创建arrey:widthlength,但仅适用于width。对我来说,这段代码表明我们只创建了arrey [1d],而不是它应该是[2d],图像是2d的...
    下面我发送一个图纸,我为我的推理。

试着理解pset CS50 smiley的代码行。

rekjcdws

rekjcdws1#

实际上在这一行

RGBTRIPLE (*image)[width] = calloc(height, width * sizeof(RGBTRIPLE));

RGBTRIPLE[height][width]类型的二维数组分配了一个存储器,并且将其地址分配给声明的指针image。分配给该二维数组的存储器被零初始化。
注意如果你有一个二维数组比如

RGBTRIPLE array[height][width];

则声明并初始化指向数组第一个元素的指针,如下所示

RGBTRIPLE ( *image )[width] = array;

也就是说,用作初始化表达式的数组指示符隐式转换为指向其第一个元素的指针。
在您的情况下,不是用数组赋给指针,而是用为这样的数组动态分配的内存地址赋给指针。
如果编译器支持可变长度数组,则该行

RGBTRIPLE (*image)[width] = calloc(height, width * sizeof(RGBTRIPLE));

可以改写成

RGBTRIPLE (*image)[width] = calloc(height, sizeof( RGBTRIPLE[width] ) );

从中可以看出,存在为RGBTRIPLE[width]类型的height一维数组分配的存储器,该RGBTRIPLE[width]类型的height一维数组用于RGBTRIPLE[height][width]类型的二维数组。
因此,解引用指针图像(如( *image )),您将获得二维数组的第一“行”。要访问第一行的元素,您可以编写例如( *image )[0]( *image )[1]等。如果每个“行”的元素都有结构类型,则可以编写例如问题( *image )[0].rgbtBlue中所示的内容。

r3i60tvu

r3i60tvu2#

随机选择下表中的RGB变量。例如,如果高度= 6宽度= 5
RGBTRIPLE image[6][5]

|{{255, 255, 255},| {0, 0, 0},| {255, 0, 0},| {0, 255, 0},| {0, 0, 255}}
---------------------------------------------------------------------
|{{255, 255, 255},| {0, 0, 0},| {255, 0, 0},| {0, 255, 0},| {0, 0, 255}},
---------------------------------------------------------------------
|{{255, 255, 255},| {0, 0, 0},| {255, 0, 0},| {0, 255, 0},| {0, 0, 255}},
---------------------------------------------------------------------
|{{255, 255, 255},| {0, 0, 0},| {255, 0, 0},| {0, 255, 0},| {0, 0, 255}},
---------------------------------------------------------------------
|{{255, 255, 255},| {0, 0, 0},| {255, 0, 0},| {0, 255, 0},| {0, 0, 255}},
---------------------------------------------------------------------
|{{255, 255, 255},| {0, 0, 0},| {255, 0, 0},| {0, 255, 0},| {0, 0, 255}}
---------------------------------------------------------------------

上述2D图像可以表示为这样的1D阵列?RGBTRIPLE *image = calloc(6 * 5, sizeof(RGBTRIPLE));
为了将图像表示为1D数组,我们使用calloc()6*5=30 RGBTRIPLE结构体分配内存(即每个像素一个结构体),并将第一个结构体的地址存储在指针变量中。

相关问题