2014-04-26 47 views
0

(我知道有無數的AA的問題和答案對SO有關數組和指針,而是通過許多人涉水後,我仍然沒有得到它。)正確的語法從數組指針訪問值?

問題:什麼是正確的語法訪問值從數組指針?

背景:我所做的很簡單:我定義了一些數組,然後定義一個指向這些數組的數組(下面的代碼)。我正在這樣做,以便我可以在for..loop中引用我的'circle'數組。 (我意識到我可以通過定義一個多維數組來完全跳過指針,但是爲了便於編碼和在此階段快速更改,只需定義一次'circle'數組將會很有幫助)。

我在嘗試訪問陣列數據時遇到問題。這符合但數據是垃圾:

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} 

回答

0

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

方法一:

#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]); 
     } 
    } 
} 
+0

謝謝!第一種方法效果很好(現在看起來更簡單一些) –

1
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); 

另外,還要考慮storing circle<n> and circleArray in flash代替。

+0

就試了一下,而不*,它不會編譯 - 錯誤:「從 '字節*' 到 '字節' 無效的轉換「 - (是的,我計劃一旦我得到寫入的靜態數據就使用flash mem ;-) –

+0

它抱怨哪一行? –

+0

我試過了:'byte circleArray [] [7] = {circle0,circle1,circle2,circle3,circle4};'(沒有*)並且得到了'byte *'無效轉換爲'byte'的錯誤「 –