假设有一个 int** 类型的变量,它是指向 5x5 二维数组的指针:
int** ptr_array_5by5;
和一个具有以下原型(prototype)的函数:
void print2DArray_with5Columns(int (*ptr_row)[5]);
有没有办法将 ptr_array_5by5 转换为某种类型,以匹配函数第一个参数的类型?
print2DArray_with5Columns( (<some casting type>) ptr_array_5by5)
这里要认识到的重要一点是 int**
不是指向任何二维数组的指针。它是一个指向 1D 的指针指针数组。 int (*)[5]
是一个指向二维数组的指针int
(或者更准确地说,它是指向第一个元素的指针这样的数组)。您几乎可以转换任何指针类型使用 reinterpret_cast
到任何其他指针类型,但它是也几乎可以保证不会在运行时工作。 (有特殊异常(exception),但它们都是特定于平台的,并且非常接近硬件。)
如果你真的有一个 int**
指向 5 个 int*
,每个它指向 5 int
,你需要一个 int (*)[5]
,唯一的您将能够成功转换的方法是对实际基础数据的转换(这将涉及一个拷贝),而不是对指针的转换。像这样的东西:
int tmp[5][5];
for ( int i = 0; i != 5; ++ i ) {
int* row = ptr_array_5by5[i];
for ( int j = 0; j != 5; ++ j ) {
tmp[i][j] = row[j];
}
}
然后您可以将 tmp
传递给您的函数而无需任何转换:数组到指针的隐式转换将转换int [5][5]
到 int (*)[5]
。
我是一名优秀的程序员,十分优秀!