01: プログラミング言語とは何か 02: 0から99まで印字するプログラムの解説 03: Pythonで書くと... 04: 変数と関数 05: 条件分岐とループ 06: プリプロセス 07: ポインタと配列1 08: ポインタと配列2 09: ポインタと配列3 0A: 文字列 0B: 多次元配列 0C: ファイル入出力 0D: 構造体 0E: コマンドライン引数 0F: 数値を読み込んで総和と平均を表示するプログラム 10: 数値を読み込んで総和と平均を表示するPythonプログラム 11:【番外編】文章中の単語を出現頻度順に表示するプログラム 12:【番外編】コマンドライン引数を処理するイディオム 13:【番外編】C言語でクロージャを実装する
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関数は完全なものではないし(例えば引数が正の値かどうか確認していない),本来ならばいつかはメモリを解放しなければならないので,そのための関数も必要である.とはいえ,当座はこれで十分だとぼくは思う.