繁体   English   中英

C中的数组语法混淆

[英]Array Syntax Confusion in C

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

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

 *(buffer+(count)) = triple;  

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

buffer[count] = triple;

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

*(buffer+(count)) = triple;

等于:

buffer[count] = triple;

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM