C中的数组语法混淆

时间:2014-01-26 16:13:47

标签: c arrays syntax cs50

我正在尝试通过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++;
        }
    }

3 个答案:

答案 0 :(得分:2)

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

 *(buffer+(count)) = triple;  

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

buffer[count] = triple;

答案 1 :(得分:1)

请记住,写x[i]等于写*(x+i),即将i加到指针x并读取(或写入)该地址的值。所以

*(buffer+(count)) = triple;

等于:

buffer[count] = triple;

还要记住,当您向指针添加整数时,如buffer+(count)中所示,您将指针递增count*sizeof(element_of_buffer)。如果要递增一个字符指针,这将向指针添加1,如果对32位机器中的整数指针执行相同操作,则会向指针添加4(4个字节,整数的大小)。这对您来说是透明的,并且由于指针总是引用有效的内存位置,即每个元素大小的倍数。

答案 2 :(得分:0)

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

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

至于此处的语法,*(buffer + count)buffer[count]相同。

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