我有一个大小为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