Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【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って次の試験からなんだね👀