【问题标题】:correct way to initialize a multidimensional array pointer from a particular address从特定地址初始化多维数组指针的正确方法
【发布时间】:2019-08-07 15:17:26
【问题描述】:

我想在 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。

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

【问题讨论】:

    标签: c arrays pointers initialization


    【解决方案1】:

    您可以将地址转换为(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] 将访问地址为0x40000000 + (i * 320) + j 的unsigned char 元素。

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2012-10-27
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多