簡體   English   中英

如何將二維數組轉換為指針的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM