-1

这就是我正在做的事情:

const uint16_t LAYERS_RIGHT[TOTAL_LAYERS][NBROW][NBCOL] = {
  {{c00, c10, c20, c30, c40, c50, c60},
   {c01, c11, c21, c31, c41, c51, c61},
   {c02, c12, c22, c32, c42, c52, c62},
   {c03, c13, c23, c33, c43, c53, c63},
   {c04, c14, c24, c34, c44, c54, c64},
   {c05, c15, c25, c35, c45, c55, c65}}
   /* blah blah */
};
const uint16_t LAYERS_LEFT[TOTAL_LAYERS][NBROW][NBCOL] = {
   /* blah blah */
   /* blah blah */
};

uint16_t *(LAYERS[TOTAL_LAYERS][NBROW][NBCOL]);

我的目标是尝试创建一个指向右侧结构或左侧结构的指针:

LAYERS = &LAYERS_RIGHT;

编译器说:

error: incompatible types in assignment of 
'const uint16_t (*)[7][6][7] {aka const unsigned int (*)[7][6][7]}' to 
'uint16_t* [7][6][7]         {aka unsigned int* [7][6][7]}'

如何使我的代码工作?

4

1 回答 1

1

您已LAYERS定义为 3D 指针数组。你想要一个指向 3D 数组的 const 指针:

const uint16_t (*LAYERS)[TOTAL_LAYERS][NBROW][NBCOL];

但是,要使用它,您需要使用如下语法:

(*LAYERS)[a][b][c];

如果你想索引LAYERS为一个 3D 数组,你可以像这样定义它:

const uint16_t (*LAYERS)[NBROW][NBCOL];

并像这样分配它:

LAYERS = LAYERS_RIGHT;

这利用了在某些情况下数组衰减为指向第一个元素的指针这一事实。上述任务就是其中之一。

LAYERS_RIGHT是 的数组const uint16_t [NBROW][NBCOL],因此这些数组元素之一的地址的类型是const uint16_t (*)[NBROW][NBCOL],即 的类型LAYERS

然后LAYERS[0]引用第一个const uint16_t [NBROW][NBCOL]LAYERS[1],第二个,依此类推。

所以在上面的赋值之后,这个表达式

LAYERS_RIGHT[a][b][c];

产生与此表达式相同的值:

LAYERS[a][b][c];
于 2016-09-22T17:57:53.827 回答