2016-12-07 304 views
2

我有一個大小爲240x320字節的數組,指向此緩衝區的指針存儲在內存地址0xE30014中。我曾嘗試將其定義爲如下:指向數組的指針

#define buffer (*(uint8_t (*)[240][320])0xE30014) 

因爲我希望能夠索引這樣的方式與磁盤陣列:

buffer[x][x] = some_val; 

然而,這將引發的錯誤的陣列不一個合法的左值。我想知道當前定義有什麼問題?任何幫助深表感謝。

+0

聲明'uint8_t ** buffer; '。你可以做buffer [0] [0] = 0;如果你知道地址,使緩衝區= 0xE30014。 – MayurK

+0

更新後,所以它不是那麼容易;但是,是的,這回答了直接的問題,嘿。 – MateoConLechuga

+0

呵呵:('但是,這會拋出一個數組不是合法的左值錯誤。::這裏是什麼數組?發佈確切的錯誤print – MayurK

回答

0

下標運算符[]可以主要用於數組或指針。但是,在這裏,您正在使用一個宏,用於您要使用的所謂的指針。現在,buffer將被(*(uint8_t (*)[240][320])0xE30014)直接替換,編譯器發現它既不是指針也不是聲明數組,因此也是錯誤。

編譯器將您的表達式視爲一個類型常量,並且不會將其視爲指針,因此會將其視爲錯誤。

+0

對,所以它看起來像它必須是一個變量而不是宏,我想這是可以接受的 – MateoConLechuga

+0

是的,一個變量 – Jay

+0

'(*(uint8_t(*)[240] [320])0xE30014)'是一個類型爲'uint8_t [240] [320]'的左值',一個實際的數組。它已經通過取消引用一個指向數組的指針來獲得,而這個指針本身來自一個類型轉換,這是無關緊要的。 – Quentin

0

我只想補充一點,我對此解決方案的可接受答案是解引用指針,然後鍵入它。額外的轉換是必要的,因爲指向數組和數組的指針是「相同」的東西。

#define buffer (**(uint8_t(**)[240][320])0xE30014)