如何将二维数组转换为指针指针

时间:2014-02-14 15:40:22

标签: c++

假设您有一个初始化为

的二维数组
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]

我的问题是,如何进行此转换?

2 个答案:

答案 0 :(得分:3)

指针和二维数组的指针数组是C:

中完全不同的数据结构
  • int **通常是指指针数组,每个指针指向不同的行(在别处分配)
  • 引擎盖下的
  • int [5][5]是一个简单的线性数组,其中行一个接一个地存储,编译器自动对索引执行计算以访问正确的元素。

所以,拥有int[5][5],你必须自己构建指针数组,这将作为一个"索引"对于矩阵的行。

int * m2[5];
for(int i=0; i<5; ++i)
    m2[i]=M[i];
f(m2);

答案 1 :(得分:0)

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]));