C言語の基礎
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
int (*op[2])(int, int) = {add, mul};
int r = 1;
for (int i = 0; i < 2; i++)
r = op[i](r, 3);
printf("%d\n", r);
return 0;
}関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
- A3
- B6
- C12
答えと解説を見る
正解:C. 12
op は、int を2つ受け取って int を返す関数へのポインタを2つ並べた配列で、op[0] に add、op[1] に mul の番地が入っています。op[i](r, 3) は、そのポインタが指す関数を呼び出します。i = 0 で r = add(1, 3) = 4、i = 1 で r = mul(4, 3) = 12 になります。関数ポインタは、処理の切り替えの表や、割り込みのベクタ、コールバックなどに使われます。
- A. 毎回 r = 1 から計算し、最後の mul(1, 3) = 3 だけが残ると考えた場合の値です。
- B. mul を先に、add を後に呼んだ場合の値です(1 × 3 = 3、3 + 3 = 6)。
- C. 正しい。add(1, 3) = 4、続いて mul(4, 3) = 12 です。