我想在C中使用内存中的特定起始地址创建多维数组指针。我不完全了解正确的语法。我要完成的工作如下:

unsigned char (*vptr)[240][320] =  (unsigned char*)0x40000000;


哪里
    vptr [0] [0] = 2;将2写入地址0x40000000;
    vptr [0] [1] = 3;将3写入地址0x40000001;
    ...
    vptr [1] [0] = 4;将4写入地址0x40000240;

基本上,我的vptr在功能上等同于

unsigned char vptr[240][320] = {....};


其中&vptr == 0x40000000。

有人可以写出应该怎么做吗?
非常感谢你的帮助。

最佳答案

您可以将地址转换为(void *)0x40000000,因为可以将其转换为任何对象类型。除非您将地址强制转换为(void *)(uintptr_t)0x40000000,否则某些编译器可能会发出警告。

使用unsigned char (*vptr)[240][320],您将需要使用unsigned char访问各个(*vptr)[i][j]元素。因此,为了使事情变得容易,最好将vptr声明为unsigned char (*vptr)[320],以使vptr是指向char[320]数组的第一个元素的指针。然后,您可以使用更自然的语法unsigned char访问各个vptr[i][j]元素。例如,vptr[10][20]将访问地址unsigned char0x40000000 + (10 * 320) + 20)中的0x40000c94元素,或者通常,vptr[i][j]将访问地址unsigned char0x40000000 + (i * 320) + j元素。

如果您不想将地址强制转换为(void *),则可以强制转换为正确的指针类型。例如。 unsigned char (*vptr)[240][320] = (unsigned char (*)[240][320])0x40000000;unsigned char (*vptr)[320] = (unsigned char (*)[320])0x40000000;。 (您可能仍需要中间的(uintptr_t)强制转换,以避免出现编译器警告。)

您提到了&vptr == 0x40000000(不考虑转换),但事实并非如此。 vptr只是一个指针变量,位于编译器和链接器决定放置它的任何地址。 vptr变量本身(而不是其地址)具有值0x40000000(不考虑转换)。

10-05 18:18