【C言語】関数へのポインタをちょっと
こんばんは葛の葉です。
基本情報に備えてC言語をちょろっと勉強しています関係で、さっきちょろっと勉強した関数ポインタを書いてみることにします。
Version
$ gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
関数を作ってやる
今回は引数を2つ受けるとその引数を乗算して-1するというhogehoge関数を作ります。イマイチ限定されてそうな使いどころがない関数だ。
// sandbox.c #include <stdio.h> int hogehoge (int pri,int sec){ return pri * sec -1; }; int main (void){ int foo = 31; int bar = 3; int ret = hogehoge(foo, bar); printf("%d\n", ret); }
コンパイルして実行するとこんな感じです。さもありなん。
$ gcc sandbox.c
$ ./a.out
92
関数ポインタを使う
今回は関数ポインタを使います。
// sandbox.c #include <stdio.h> int hogehoge (int pri,int sec){ return pri * sec -1; }; int main (void){ int foo = 31; int bar = 3; int (*func)(int, int); // <- この辺が関数へのポインタ要素。 func = hogehoge; // <- func変数にhogehoge関数のポインタを代入している。 printf("%d\n", func(foo, bar)); // <- ここでfunc変数に格納されたポインタに引数を渡して結果を表示している。 }
コンパイルして実行するとおんなじです。まぁそうなるな。
$ gcc sandbox.c
$ ./a.out
92
こんな使い方なのか?
2つの関数を状況によって使い分けたい、というようなときに、こんな感じで使うのかなぁって思った。
// sandbox.c #include <stdio.h> // プロトタイプ宣言 int hogehoge (int pri,int sec); int piyopiyo (int pri, int sec); // typedef typedef int (*Two)(int pri, int sec); int main (void){ int foo; printf("数字を入力してください:"); scanf("%d", &foo); int bar = 3; Two func; // typedefにて新しいTypeが追加されている。 if (foo > 25){ printf("big\n"); func = hogehoge; } else { printf("small\n"); func = piyopiyo; } printf("%d\n", func(foo, bar)); } int hogehoge (int pri,int sec){ return pri * sec - 1; }; int piyopiyo (int pri,int sec){ return pri * sec + 13; };
main関数最後のprintf("%d\n", func(foo, bar));
はfunc
という変数名を使っています。このfunc変数は入力された数字によって参照する関数へのポインタが異なります。実行すると表示される数字を入力してください:
に対し25
の数字を超える値を入力するとhogehoge
関数へのポインタを受取り、そうでない場合はpiyopiyo
関数へのポインタを受取るようになります。
$ gcc sandbox.c $ ./a.out 数字を入力してくだし:14 small 55 $ ./a.out 数字を入力してくだし:67 big 200
ところで
基本情報のpythonって次の試験からなんだね👀