先日、C言語勉強会20回目を開催しました。

 

多次元配列を宣言した次元数よりも少ない添え字だけを指定した場合はポインタになることを説明しました。
例えば
int ary[4][2][3];
と3次元配列を宣言したところで、
ary[i]と書くとintが2x3個ならんだ2次元配列を指すポインタになり、ary[i][j]と書くとintが3個ならんだ1次元配列を指すポインタになるということです。
もちろん
ary[i][j][k]と全ての添え字を指定すると、ポインタではなくintになります。

 

3次元配列を関数の引数として渡す時、
例えば
int func(int ary[][2][3], int size);
のように書けますが、最初の仮引数はintの3次元配列のように表記していますが、intが2x3個ならんだ2次元配列を指すポインタの意味になります。
そのことを明示的に書くならば、
int func(int (*ary)[2][3], int size);
となります。
int func(int *ary[2][3], int size);
と書いてしまうとintへのポインタの2次元配列になってしまうので意味が違ってきます。

 

ついに関数ポインタに入りました。
関数ポインタ変数の宣言は関数プロトタイプ宣言の関数名のところを(*関数ポインタ名)にすればよいこと、関数ポインタに関数をセットした後で呼び出すには(*関数ポインタ名)(実引数)でもよいし関数ポインタ名(実引数)でもよいこと、関数ポインタのご利益をqsort関数を使う例題で説明しました。

 

次回は関数ポインタの続きです。