关于二维阵列

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使用参考语法.

AnT*_*AnT 7

首先,在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以了解原因.这已被解释太多次以重复它.