数组不是指针。
数组是一块连续的数据块,所有相同类型的数据都打包在一起。碰巧的是,如果您有一个指向第一个元素的指针,并且您知道数据的类型,那么您可以使用指针执行许多与数组相同的操作。
foo[5] 在数组上获得第 5 个元素,在指向第一个元素的指针上也获得第 5 个元素。
其实你可以将数组转换为foo类型隐式转换为指向第一个元素的指针。
现在,你正在做的是完全不同的事情。指向第一个元素的指针是指向int[5] 的指针——整个数组。
假设您有一个长度为 5 的指向int* 的指针数组。它们中的每一个都可以指向不同的int[5],并且您可以将int*[6] 用作二维数组。但是你会注意到这里我们有一个指向int* 的指针数组,而不是int[5] 的数组。由于数组不是指针,所以它们是不同的东西。
现在,我们可以解决这个问题了。
template<unsigned...>struct indexes{typedef indexes type;};
template<unsigned Max, unsigned...Is> struct make_indexes:make_indexes<Max-1, Max-1, Is...>{};
template<unsigned...Is> struct make_indexes<0, Is...>:indexes<Is...>{};
template<unsigned Max> using make_indexes_t = typename make_indexes<Max>::type;
template<typename T, unsigned N, unsigned M, unsigned... Is>
std::array<T*, M> as_array_of_pointers( indexes<Is...>, T(&arr)[M][N] ) {
return { arr[Is]... };
};
template<typename T, unsigned N, unsigned M>
std::array<T*, M> as_array_of_pointers( T(&arr)[M][N] ) {
return as_array_of_pointers( make_indexes_t<M>{}, arr );
}
以上是花哨的C++11写法:
std::array<int*, 5> arr = { ar[0], ar[1], ar[2] };
现在你可以把你的ar 变成一个指针数组。如果你有一个使用int** 的函数,你可以调用as_array_of_pointers 并获取一个指向第一个元素的显式指针,并依靠临时生命周期来完成这项工作:
void foo( int** x ) {}
int main() {
int a[5][3] = {0};
foo( &(as_array_of_pointers(a)[0]) );
}
这需要 C++11。您可以改为在 C++03 中手动完成。
您看到的崩溃(通过未定义的行为)可能是由于将数组的第一个元素重新解释为指向int 的指针,而不是一个或多个int(取决于相对大小指针和int 在您的系统上)。
live example