cut*_*CAT 1 c++ multidimensional-array
我在使用二维数组时遇到了一些问题.
static const int PATTERNS[20][4];
static void init_PATTERN()
{
// problem #1
int (&patterns)[20][4] = const_cast<int[20][4]>(PATTERNS);
...
}
extern void UsePattern(int a, const int** patterns, int patterns_size);
// problem #2
UsePattern(10, PATTERNS, sizeof(PATTERNS)/sizeof(PATTERNS[0]));
Run Code Online (Sandbox Code Playgroud)
在第一个语句中,我需要抛出const
二维数组PATTERNS
.原因是init函数只被调用一次,而在剩下的代码中,它PATTERNS
是严格只读的.
在第二个语句中,我需要将PATTERNS
数组传递给int**
参数.直接传递导致编译错误.
我已经解决了这个问题,就在@Andrey发布答案的同一时间.是的int[][]
,无法投入int**
.
它可以int*
通过传递&(PATTERNS[0][0])
,并且必须使用行大小(行中元素的数量)修改函数原型.该数组可以const_cast
使用参考语法.
首先,在C++中没有强制转换为数组类型(或函数类型).然而,这正是你想要做的.如果你想从某些东西中抛弃constness,你必须转换为指针或引用类型.在你的情况下,你有一个关于强制转换的接收端的引用,所以转换本身也必须是引用类型
int (&patterns)[20][4] = const_cast<int (&)[20][4]>(PATTERNS);
Run Code Online (Sandbox Code Playgroud)
当然,正如Bill已经指出的那样,从常量对象中抛弃constness(然后尝试修改对象)会导致未定义的行为.
其次,二维数组不能作为int **
指针传递到任何地方.如果你想通过你的PATTERNS
地方,你可以把它作为const int (&)[20][4]
,const int (*)[20][4]
,const int [][4]
,const int (*)[4]
或类似的东西,但不作为int **
.在SO上搜索和/或阅读阵列上的一些FAQ以了解原因.这已被解释太多次以重复它.