我想在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 char
(0x40000000 + (10 * 320) + 20
)中的0x40000c94
元素,或者通常,vptr[i][j]
将访问地址unsigned char
的0x40000000 + (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
(不考虑转换)。