[英]How to convert a two-dimensional array to a pointer of pointers
假设您有一个已初始化的二维数组,例如
int M[5][5] = { {1,3,4,2,5},
{3,5,1,6,2},
{7,5,6,2,0},
{6,2,9,7,6},
{1,0,8,5,2} };
该M
将作为参数传递给函数。 但是该函数仅接受int**
作为参数,而不接受int [][5]
。
我的问题是,如何进行转换?
指针数组和二维数组是C语言中完全不同的数据结构:
int **
通常指的是一个指针数组 ,每个指针都指向不同的行(分配在其他位置) int [5][5]
是一个普通的线性数组,其中的行彼此依次存储,并且编译器自动对索引进行计算以访问正确的元素。 因此,具有int[5][5]
,您必须自己构建一个指针数组,该数组将充当矩阵行的“索引”。
int * m2[5];
for(int i=0; i<5; ++i)
m2[i]=M[i];
f(m2);
template<unsigned...>struct indexes {};
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< class T, std::size_t X, std::size_t Y, unsigned...Is >
std::array<T*, X> as_jagged_helper( T(&arr)[X][Y], indexes<Is...> ) {
return {arr[Is]...};
}
template< class T, std::size_t X, std::size_t Y, unsigned...Is >
std::array<T*, X> as_jagged( T(&arr)[X][Y] ) {
return as_jagged_helper(arr, make_indexes<X>());
}
然后只需调用f(&(as_jagged(M)[0]));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.