2D 配列の幅を W、高さを H とします。行優先のレイアウトでは、これを行うことができます:
const int W = 3, H=2;
int m[H][W] = {{1,2,3}, {4,5,6}};
int* oneD = &m[0][0];
assert(oneD[1*W + 2] == m[1][2]); // element 6, y=1, x=2
しかし、コラムメジャーはどうですか、何かアイデアはありますか?
C では、内部的に行優先アプローチが使用されているため (m は 1,2,3,4,5,6 として連続してメモリに配置されます)、oneD で例を直接表すことができます。ただし、C は行優先のアプローチを内部的に使用しているため、列優先のレイアウトはそれほど単純に表すことはできません。したがって、正しい列優先アプローチを取得するには、次のように使用できます
#include <stdio.h>
#include <iostream>
int main() {
const int W = 3, H=2;
int m[H][W] = {{1,2,3}, {4,5,6}};
int* oneD = new int[H*W];
for(int i=0; i<W; i++)
for(int j=0; j<H; j++)
oneD[H*i+j]=m[j][i];
for(int i=0; i<H*W; i++)
std::cout<<oneD[i]<<" ";
return 0;
}