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;
}

関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。

  1. A3
  2. B6
  3. 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 です。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。
  2. 上の関数 make が返すポインタについて、正しいものはどれか。
  3. C言語で free(p); の直後に p = NULL; と書くことが勧められる理由として、最も適切なものはどれか。
  4. 上の関数 save に、8文字の文字列 "ABCDEFGH" を渡した。起こることとして正しいものはどれか。
  5. C言語で NULL ポインタを参照した(p が NULL のときに *p を読んだ)ときの説明として、正しいものはどれか。