(c言語)2次元配列を作る(malloc対応)
状況
2次元配列の仕組みの振り返り
要素数nに対してmallocをどのようにしたらできるのかの備忘録
1次元配列
void main(){ int i; int a[2]={1,2}; for(i=0;i<2;i++){ printf("a[%d]=%d\n",i,a[i]); } }
a[0]=1 a[1]=2
2次元配列
int i,j; int a[2][3]={{1,2,3},{4,5,6}};//2×3の配列 for(i=0;i<2;i++){//行 for(j=0;j<3;j++){//列 printf("a[%d][%d]=%d\n",i,j,a[i][j]); } }
a[0][0]=1 a[0][1]=2 a[0][2]=3 a[1][0]=4 a[1][1]=5 a[1][2]=6
少し表示を変えると,
1,2,3 4,5,6
つまり、書く時の書き方を変えてみる。
int a[3][3]={{1,2,3} ,{4,5,6}};
少し見やすくなったかな?、、
ここまででわかったこと
a[i][j] iは行を示すjは列を示す。
mallocによる任意の2次元配列
やり方は2通り 1. 1回のmallocですべての領域を確保する 2. 2回mallocする
イメージは以下のとおりである。
それではコードを見てみよう。
void main(){ int *a; int i,j; //やり方1// printf("--method[1]--\n"); a=(int*)malloc(sizeof(int)*(2*2));//2*2の配列を作る for(i=0;i<4;i++){ a[i]=i; } for(i=0;i<4;i++){ printf("%d",a[i]); if(i==2-1){ printf("\n");//見やすいように } } printf("\n"); free(a); } //やり方2// void main(){ printf("--method[2]--\n"); int **aa; aa=(int**)malloc(sizeof(int)*2);//行2の配列 for(i=0;i<2;i++){ aa[i]=(int*)malloc(sizeof(int)*3);//列3の配列 } for(i=0;i<2;i++){//初期化(配列に0を代入) for(j=0;j<3;j++){ aa[i][j]=i+j; } } for(i=0;i<2;i++){//行 for(j=0;j<3;j++){//列 printf("%d",aa[i][j]);//出力 } if(j!=3-1){//見やすいように printf("\n"); } } free(aa); }
結果は以下のとおりである。
--method[1]-- 01 23
--method[2]-- 012 123
まとめ
- しっかりと行列を考えてあげることで計算ができる。
- n次元行列に対しては、2のやり方だと、最初にaaをポインタのポインタのポインタの...にする必要があるので不向き
- よって、1のやり方で、0番目を0のx方向、1番目を0のy方向,2番目を0のz方向...のように組み合わせるのがベストである気がする。