2016-12-07 269 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)