我有一個大小爲240x320字節的數組,指向此緩衝區的指針存儲在內存地址0xE30014中。我曾嘗試將其定義爲如下:指向數組的指針
#define buffer (*(uint8_t (*)[240][320])0xE30014)
因爲我希望能夠索引這樣的方式與磁盤陣列:
buffer[x][x] = some_val;
然而,這將引發的錯誤的陣列不一個合法的左值。我想知道當前定義有什麼問題?任何幫助深表感謝。
我有一個大小爲240x320字節的數組,指向此緩衝區的指針存儲在內存地址0xE30014中。我曾嘗試將其定義爲如下:指向數組的指針
#define buffer (*(uint8_t (*)[240][320])0xE30014)
因爲我希望能夠索引這樣的方式與磁盤陣列:
buffer[x][x] = some_val;
然而,這將引發的錯誤的陣列不一個合法的左值。我想知道當前定義有什麼問題?任何幫助深表感謝。
下標運算符[]
可以主要用於數組或指針。但是,在這裏,您正在使用一個宏,用於您要使用的所謂的指針。現在,buffer
將被(*(uint8_t (*)[240][320])0xE30014)
直接替換,編譯器發現它既不是指針也不是聲明數組,因此也是錯誤。
編譯器將您的表達式視爲一個類型常量,並且不會將其視爲指針,因此會將其視爲錯誤。
對,所以它看起來像它必須是一個變量而不是宏,我想這是可以接受的 – MateoConLechuga
是的,一個變量 – Jay
'(*(uint8_t(*)[240] [320])0xE30014)'是一個類型爲'uint8_t [240] [320]'的左值',一個實際的數組。它已經通過取消引用一個指向數組的指針來獲得,而這個指針本身來自一個類型轉換,這是無關緊要的。 – Quentin
我只想補充一點,我對此解決方案的可接受答案是解引用指針,然後鍵入它。額外的轉換是必要的,因爲指向數組和數組的指針是「相同」的東西。
#define buffer (**(uint8_t(**)[240][320])0xE30014)
聲明'uint8_t ** buffer; '。你可以做buffer [0] [0] = 0;如果你知道地址,使緩衝區= 0xE30014。 – MayurK
更新後,所以它不是那麼容易;但是,是的,這回答了直接的問題,嘿。 – MateoConLechuga
呵呵:('但是,這會拋出一個數組不是合法的左值錯誤。::這裏是什麼數組?發佈確切的錯誤print – MayurK