簡體   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