1

我正在尝试通过 iTunes 大学/哈佛 CS50 课程自学 C。在其中将编写一个程序来调整位图图像文件的大小。为此,我定义了一个数组(缓冲区)并编写了程序运行所需的代码——它确实有效。但是,我不得不作弊并用谷歌搜索答案,因为我无法弄清楚,而且我不理解解决方案中的特定语法,希望有人能提供帮助。

代码块如下所示,我在评论中添加了我的具体困惑点:

// allocate array to hold scanline pixels - this is the array I define
RGBTRIPLE *buffer = malloc(bi.biWidth * sizeof(RGBTRIPLE));

// declare variable to track position in buffer array
int count;

// iterate over infile's scanlines
for (int i = 0, height = abs(oldHeight); i < height; i++)
{
    // initialize count var to 0
    count = 0;

    // iterate over pixels in scanline
    for (int j = 0; j < oldWidth; j++)
    {
        // temporary storage
        RGBTRIPLE triple;

        // read RGB triple from infile
        fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

        // place pixel in buffer array n times
        for (int k = 0; k < n; k++)
        {
            // below is the confusion. Some sudo code would be great!
            *(buffer+(count)) = triple;
            count++;
        }
    }
4

3 回答 3

2

首先,该变量buffer不是数组变量。它是一个指针变量。请记住,数组不是指针
现在线

 *(buffer+(count)) = triple;  

正在使用指针算术。buffer是指向RGBTRIPLE类型的指针,在为其分配空间后,它指向该内存的第一个块。将 的值添加count到它的值会使其增加到下一个块,即给出下一个块的地址。使用运算符取消引用此地址*会给出存储在该地址的值。它也可以写成

buffer[count] = triple;
于 2014-01-26T16:18:47.363 回答
1

请记住,写x[i]等于写*(x+i),也就是说,将 i 与指针 x 相加并读取(或写入)该地址处的值。所以

*(buffer+(count)) = triple;

等于:

buffer[count] = triple;

还请记住,当您将整数添加到指针时,如在 中buffer+(count),您将指针递增count*sizeof(element_of_buffer)。如果你正在递增一个 char 指针,这将为指针加 1,如果你对 32 位机器中的整数指针执行相同操作,这将为指针加 4(4 个字节,整数的大小)。这对您来说是透明的,因为指针将始终引用有效的内存位置,即每个元素大小的倍数。

于 2014-01-26T16:18:09.763 回答
0

我猜你不明白的部分是这一点:*(buffer+(count))

有几件事要记住,第一件事buffer实际上不是一个数组,它是指向某个内存的指针。但是,指针可以作为数组进行索引,并且随着数组衰减为指针,您可以将数组用作指针。

至于这里的语法,*(buffer + count)buffer[count].

琐事时间:由于加法的交换性质,*(buffer + count)也可以写为*(count + buffer),这导致它count[buffer]是一个有效的表达式。(是的,这种“向后”的索引方式存在于实际代码中。)

于 2014-01-26T16:19:04.313 回答