从特定地址初始化多维数组指针的正确方法

correct way to initialize a multidimensional array pointer from a particular address

我想用 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],您需要使用 (*vptr)[i][j] 访问单个 unsigned char 元素。因此,为了方便起见,最好将 vptr 声明为 unsigned char (*vptr)[320],这样 vptr 就是指向 char[320] 数组第一个元素的指针。然后,您可以使用更自然的语法 vptr[i][j] 访问单个 unsigned char 元素。例如,vptr[10][20] 将访问地址 0x40000000 + (10 * 320) + 20 (0x40000c94) 处的 unsigned char 元素,或者一般而言,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(忽略转换)。