从特定地址初始化多维数组指针的正确方法
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
(忽略转换)。
我想用 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
(忽略转换)。