我正在尝试通过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++;
}
}
答案 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]
成为有效的表达式。 (是的,这种“后向”索引方式存在于实际代码中。)