簡體   English   中英

來自數組指針的正確語法訪問值?

[英]proper syntax access values from an array pointer?

(我意識到關於數組和指針的問題和解答不計其數,但是經過大量的討論之后,我仍然沒有得到答案。)

問題:來自數組指針的正確語法訪問值是什么?

背景:我正在做的事情非常簡單:我定義了一些數組,然后定義了一個指向這些數組的數組(下面的代碼)。 我這樣做是為了可以在for..loop中引用“圓形”數組。 (我意識到只定義一個多維數組就可以完全跳過指針,但是為了便於編碼和在此階段快速更改,只定義一次“圓形”數組將很有幫助)。

嘗試訪問數組數據時遇到問題。 這符合,但數據是垃圾:

for (int i = 0; i < circleArrayLength; i++) {

   for (int c = 0; c < 6; c++) {
    byte *index = circleArray[i][c]; // WRONG

    writeBufferSingle(basePattern[*index][0], basePattern[*index][1], 1);
   }
   writeScreen();
   delay(50);
}

那么,數組指針的正確語法訪問值是什么?


byte circle0[7] = { 0, 1, 40, 44, 43, 42, 41 };
byte circle1[7] = { 1, 2, 39, 45, 44, 41, 40 };
byte circle2[7] = { 2, 3, 38, 46, 45, 40, 39 };
byte circle3[7] = { 3, 4, 37, 47, 46, 39, 38 };
byte circle4[7] = { 4, 5, 36, 48, 47, 38, 37 };


byte* circleArray[][7] = { circle0, circle1, circle2, circle3, circle4}
 byte* circleArray[][7] = { circle0, circle1, circle2, circle3, circle4} 

幾乎可以肯定這是錯誤的。 circleArray不應是byte*數組的數組。

byte circleArray[][7] = { circle0, circle1, circle2, circle3, circle4};

...

byte index = circleArray[i][c];

writeBufferSingle(basePattern[index][0], basePattern[index][1], 1);

另外,請考慮改為circle<n>circleArray存儲在閃存中

有兩種方法可以做到這一點。

方法一:

#include <stdio.h>

typedef char byte;

int main(void)
{
    byte circle0[7] = { 0, 1, 40, 44, 43, 42, 41 };
    byte circle1[7] = { 1, 2, 39, 45, 44, 41, 40 };
    byte circle2[7] = { 2, 3, 38, 46, 45, 40, 39 };
    byte circle3[7] = { 3, 4, 37, 47, 46, 39, 38 };
    byte circle4[7] = { 4, 5, 36, 48, 47, 38, 37 };

    byte *circleArray[] = { circle0, circle1, circle2, circle3, circle4};

    size_t circleArrayLength = sizeof(circleArray)/sizeof(circleArray[0]);

    for (size_t i = 0; i < circleArrayLength; i++) {
        for (size_t c = 0; c < 7; c++) {
            printf("circleArray[%zu][%zu] = %d\n", i, c, circleArray[i][c]);
        }
    }
}

方法二:

#include <stdio.h>

typedef char byte;

int main(void)
{
    byte circle0[7] = { 0, 1, 40, 44, 43, 42, 41 };
    byte circle1[7] = { 1, 2, 39, 45, 44, 41, 40 };
    byte circle2[7] = { 2, 3, 38, 46, 45, 40, 39 };
    byte circle3[7] = { 3, 4, 37, 47, 46, 39, 38 };
    byte circle4[7] = { 4, 5, 36, 48, 47, 38, 37 };

    byte (*circleArray[])[7] = { &circle0, &circle1, &circle2, &circle3, &circle4};

    size_t circleArrayLength = sizeof(circleArray)/sizeof(circleArray[0]);

    for (size_t i = 0; i < circleArrayLength; i++) {
        for (size_t c = 0; c < 7; c++) {
            printf("circleArray[%zu][%zu] = %d\n", i, c, (*circleArray[i])[c]);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM