Another introduction to programming language C 0B: 多次元配列

C言語には本当の意味での多次元配列は無い.

多次元配列をシミュレートするには,ポインタの配列を作る必要がある.事実,名著 Numerical Recipes in C は行列をポインタ配列で表している.いまひとつの方法は,いつも一次元配列を使い,行列としてのアクセスが必要になったら配列を「スライス」して必要な部分を切り出す方法である.前者は分かりやすいがメモリ効率が悪い.後者は効率はよいが慣れるまでは理解しがたい.

配列のスライスを使いこなせるようになるまでは,多次元配列には配列の配列を使うのがよい.

次のコードは,配列の配列を返す.

#include <stdlib.h>

double **mcalloc_double(int m, int n) {
  int i;
  double **ret = calloc(m, sizeof(double *));
  for (i = 0; i < n; i += 1) {
    ret[i] = calloc(n, sizeof(double));
  }
  return ret;
}

関数mcalloc_doubleを使えば,容易にdouble型の多次元配列が手に入る.例えば100x50の実数行列は次のようにすれば確保,アクセスができる.

double **a = mcalloc_double(100, 50);
a[30][20] = 10.0;

ここで示したmcalloc関数は完全なものではないし(例えば引数が正の値かどうか確認していない),本来ならばいつかはメモリを解放しなければならないので,そのための関数も必要である.とはいえ,当座はこれで十分だとぼくは思う.
Comments