为何在C++中无法声明该双指针数组?
问题解析:为什么
const int(*)[2]无法转换为const int**? 先看你给出的代码:
void foo(){ static const int tree1[][2] = { {FULL,1}, {FULL,2}, {EMPTY,4}, {EMPTY,5}, {EMPTY,3} }; static const int tree2[][2] = { {FULL,1}, {EMPTY,2}, {FULL,3}, {LEFT,4}, {LEFT,5}, {EMPTY,6}, {RIGHT,7}, {RIGHT,8}, {EMPTY,9} }; static const int ** whydoesthisnotwork[]= {tree1,tree2}; }
对应的报错:
cannot convert ‘const int (*)[2]’ to ‘const int**’ in initialization
核心问题:类型完全不匹配
const int(*)[2]和const int**是两种完全不同的类型:
tree1/tree2是二维数组,作为右值时会退化为指向长度为2的const int数组的指针,也就是const int (*)[2]。const int**是指向const int指针的指针,它指向的是一个指针数组,每个元素都是const int*类型,指向独立的一维int数组。
两者的内存布局天差地别:二维数组是一块连续的内存块,而const int**指向的是“指针数组+多个分散的一维数组”结构,编译器不允许这种隐式转换,否则会破坏类型安全,导致内存访问错误。
你尝试的const int* const*同样无效,因为const int(*)[2]和const int*也不兼容——前者指向的是长度固定的数组,后者指向单个int,类型本质不同。
解决方案
让指针数组的元素类型和tree1/tree2退化后的类型匹配即可:
void foo(){ static const int tree1[][2] = { {FULL,1}, {FULL,2}, {EMPTY,4}, {EMPTY,5}, {EMPTY,3} }; static const int tree2[][2] = { {FULL,1}, {EMPTY,2}, {FULL,3}, {LEFT,4}, {LEFT,5}, {EMPTY,6}, {RIGHT,7}, {RIGHT,8}, {EMPTY,9} }; // 正确类型:存储"指向长度为2的const int数组的指针"的数组 static const int (*whydoesthiswork[])[2] = {tree1, tree2}; }
这里const int (*whydoesthiswork[])[2]的含义是:whydoesthiswork是一个数组,每个元素都是const int (*)[2]类型(即指向长度为2的const int数组的指针),和tree1/tree2的类型完全一致,因此不会出现转换报错。
内容的提问来源于stack exchange,提问作者Luca Fiorini
相关产品推荐
相关产品推荐

