関数ポインタ変数ptfに自作関数のアドレスを代入し*ptfをつかって自作関数を実行してみましょう

ソーラー「それでは


関数ポインタ変数宣言により作製された


関数ポインタ変数ptfに自作関数newmadefunctionの


アドレスを代入したのち


*ptf


を用いて


自作関数newmadefunctionを実行してみよ~う😊


うまくいくかな?


この時の


自作関数の定義は


int newmadefunction(int x) {


printf("%d円GETしました\n", x);


return 1;

}


とします。



さあ *ptfを用いて自作関数newmadefunctionが実行できるかな😊」



アレサ「とても楽しみですの」


ソーラー「それでは 


*ptfを用いた次のプログラムを


ご覧ください。」



#include <stdio.h>



int newmadefunction(int x) {


printf("%d円GETしました\n", x);


return 1;


}


int main(void) {


int(*ptf)(int x);


ptf = newmadefunction;


(*ptf)(1);


return 0;

}


ソーラー「*ptfが記述されています。


それでは~


今プログラムを・・・



コンパイルっ!







コンパイル結果

(EAZY IDECの場合)

1円GETしました


ビルド結果

(Visual Studioの場合)

1円GETしました


ソーラー「やったね。


*ptfをつかって


自作関数newmadefunctionが実行できたね。」



アレサ「ソーラーさん 


このプログラムでは何がおこなわれているのですか?」



ソーラー「このプログラムが実行されると


自作関数newmadefunctionは


機械語に翻訳されてメモリに格納されます。


その時の


機械語に翻訳された自作関数newmadefunctionを格納している


先頭のメモリのアドレスを


格納する関数ポインタ変数ptfが


関数ポインタ変数宣言


int(*ptf)(int x);


により


作製されています。


*ptfが


機械語に翻訳された自作関数newmadefunctionが格納されているメモリに


アクセスして


自作関数newmadefunctionを


呼び出して実行することができるためには


関数ポインタ変数ptfに


自作関数newmadefunctionを格納している先頭のメモリのアドレスが


格納されてなければいけません。」


アレサ「*ptfをつかって


自作関数newmadefunctionを


呼び出して実行するために


関数ポインタ変数ptfに


自作関数newmadefunctionを格納している先頭のメモリのアドレス


を代入するのですの?」


ソーラー「そうなんだ。


そうすることにより


*ptfは自作関数newmadefunctionを表すことになるんだ。


そこで


どのように


自作関数newmadefunctionを格納している先頭のメモリのアドレス



関数ポインタ変数ptfに代入するかなんだけど


このプログラムでも記述されているように


ptf = newmadefunction;





関数ポインタ変数に自作関数名newmadefunction


を代入すれば


自作関数newmadefunctionを格納している先頭のメモリのアドレス



関数ポインタ変数ptfに代入することができるんだよ。」



アレサ「ptf = newmadefunction;


でよいのですか


とても素直な命令文ですね。」


ソーラー「そうだね😊


これで


*ptfを用いて


自作関数newmadefunctionを格納しているメモリにアクセスして


自作関数newmadefunctionを呼び出して


使用することができるようになるんだ。



プログラムのなかの


(*ptf)(1);


を見てみてよ。(´▽`*)



(*ptf)(1);


が実行されて


コンパイル結果


1円GETしました


が表示されているんだよ。」



アレサ「ソーラーさん


(*ptf)(1);


では何がおこなわれているのですか?😊」



ソーラー「*ptfをもちいて自作関数newmadefunctionを


呼び出して使用することができるようになったけど


自作関数の定義


int newmadefunction(int x) {


printf("%d円GETしました\n", x);


return 1;


}


を見ても分かる通り


自作関数newmadefunctionは数値を格納するint xを引数に


もっているんだ。


(*ptf)(1);



実は


(*ptf)(int x);



int xに


が代入されているものなんだよ。



(*ptf)



自作関数newmadefunction



同じ働きをしているので


これは


自作関数newmadefunctionに1が代入されているのと


同じことをあらわしているんだ。


だから


int xに1が代入されて


(*ptf)(1);


が実行されると


自作関数の定義


int newmadefunction(int x) {


printf("%d円GETしました\n", x);


return 1;


}


どおり


printf("%d円GETしました\n", 1);


が実行されて


コンパイル結果


1円GETしました



表示されるんだ


どうかな? どうかな?


うまく説明できたかな?」


アレサ「はいっ うまく説明できているとおもいますの。


ソーラーさん」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます