将指针赋值给 const
Assign pointer to const
这是我正在做的事情:
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]}'
如何让我的代码工作?
您已将 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];
这是我正在做的事情:
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]}'
如何让我的代码工作?
您已将 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];