[英]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.