C言語学習時、確かに勉強した記憶があるんだが書き方忘れた。で、詰まった。
備忘録代わりにメモメモ。
int array[2][3];
なんて配列があって、これを引数に取る関数は、以下のようになる。
/* [x][3]な二次元配列を取る関数 */
int function(int arg[][3]);
int function(int (*arg)[3]); // これでもおk
n次元配列の、右から数えてn-1次元目までは要素数を書かなければならない。
つまり、
/* [x][4][5]な三次元配列を取る関数 */
int function3(int arg[][4][5]);
/* [x][6][7][8]な三次元配列を取る関数 */
int function4(int arg[][6][7][8]);
ただし、
/* 1次元目も2次元目も何が来ても問題なく処理出来る関数……のつもり */
int functionX(int arg[][]);
みたいな真似は不可。
まぁ、C/C++の配列の仕様(添字が範囲外の値かどうかチェックしない)を考えると、この制限も納得なんだけど。
C++だとtemplate使えば上で挙げたような真似は一応出来る。
template<std::size_t N> int function(int arg[][N]);
int a[2][3], b[4][5]; // aとbの添字の数値が異なる点に注目
function(a);
function(b);
まぁこれで何が嬉しいかというと、例えばchar[][]
から任意文字列を探すstd::find()
の特殊化が出来るよね、とか。
次回に微妙に続く。