自作関数newmadefunctionの命令文を格納している先頭のメモリのアドレスを格納する関数ポインタ変数を作製してみよう。その1

ソーラー

「自作関数newmadefunctionの命令文を


格納している先頭のメモリのアドレス


を格納する


関数ポインタ変数の名前をptfに設定します。


(関数ポインタ変数名は 自由に設定することができます)


自作関数newmadefunctionの命令文を格納している


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


関数ポインタ変数ptfに代入すれば


*ptf



自作関数newmadefunction


をあらわしていることになり


*ptf


を用いて


自作関数newmadefunctionを


呼び出して使用することができるようになります。


と概要がわかったところで


自作関数newmadefunctionの命令文を


格納している先頭のメモリのアドレス


を格納する


関数ポインタ変数を作製してみよう。」


アレサ「ポインタ変数を作製するということは


ポインタ変数宣言をおこなうのですの?」


ソーラー「そのとおり(*^_^*)


関数ポインタ変数を作製するには


関数ポインタ変数宣言を行います。


関数ポインタ変数宣言は


戻り値を格納する型 (*関数ポインタ変数名)(引数);


で構成されているんだ。


例えば


自作関数newmadefunctionの定義が


int newmadefunction(int x){


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


return 1;

}

なら


☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


int型に格納される自作関数の戻り値を return 1;


と記述することにより


1に設定しました


               solarplexussより)


☆  ☆  ☆  ☆  ☆  ☆  ☆  ☆


コンパイル後


機械語に翻訳された


自作関数newmadefunctionの命令文を


格納している先頭のメモリのアドレスを格納する


関数ポインタ変数ptfは


関数ポインタ変数宣言


int (*ptf)(int x)


で作製されるんだよ


ここで


ptfは関数ポインタ変数名で


関数ポインタ変数名は


自由に名前を付けることができます。」


アレサ「自作関数の定義


int newmadefunction(int x){


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


return 1;

}


int newmadefunction(int x)



関数ポインタ変数宣言


int (*ptf)(int x);


は似ていますの」


ソーラー「確かに僕もそう思うな


変数宣言


int a;


により作製されたint型の変数aの


アドレスである&a


を格納するポインタ変数ptaは


ポインタ変数宣言


int *pta


で作製されたよね。


つまり


int型の変数aのアドレスを格納するポインタ変数ptaは


int *(イントアスタリスク型)に格納されるんだ。


同様に


int型に自作関数newmadefunctionの戻り値が格納されるとき


自作関数newmadefunctionのアドレスを格納する関数ポインタ変数ptfは


int *(イントアスタリスク型)に格納されるんだ。


別の見方をするなら


プログラムがコンパイルされると


自作関数newmadefunctionを構成する機械語は


メモリに格納されることになりますが


自作関数newmadefunctionを構成する機械語が実行されたときの


自作関数newmadefunctionの戻り値は


int newmadefunction(int x)


とint型に格納されます。


同様に


自作関数 newmadefunctionと等しい働きをする*ptf


が実行されたときの戻り値も


int (*ptf)(int x)



int型に格納されるともいえます。


つまり

変数宣言

int a;

により作成された変数aのアドレス&aを


ポインタ変数宣言

int *pta;

により作成された


ポインタ変数ptaに代入すると


*ptaは変数aと等しい働きをするから


*ptaは 


ポインタ変数宣言

int *pta;

記述されるように


*ptaはint型に格納されると言っているのと同じことなんだ。」


アレサ「ソーラーさん 絶好調ですの(´▽`*)


何か いいことでもあったのですか?」


ソーラー「いやあ ここまでこれてうれしくってね


それに 先にマックスはコンピュータの世界にいって


遊んでるみたいだからね。


ふふっ


順調に進んでるみたいだよ。


そろそろ


僕たちも参上しないとね。」


アレサ「マックスさん 見かけないと思ったら


そうだったんですの」


ソーラー「どうやって


コンピュータの世界にいったのかは僕にもわからないな・・・


ここで


関数ポインタ変数宣言が


int (*ptf)(int x)


と記述されるのにご注目ください。


なぜ


int *ptf(int x)


でなく


int (*ptf)(int x)


と記述されているのかというと


int *ptf(int x)


と記述してしまうと


ptf(int x)



1まとまりのポインタ変数とみなされ


ptfの関数ポインタ変数宣言でなく


普通の


ptf(int x)のポインタ変数宣言となってしまうからです


つまり


ptfという関数ポインタ変数でなく


ptf(int x)という名前のポインタ変数を


作製してしまうことになるんだ。


だから


int (*ptf)(int x);



*ptfを()でくくり


自作関数の引数である(int x)


とptfが1まとまりにならないように


(*ptf)と(int x)が区別されるよう


ptfの関数ポインタ変数宣言がおこなわれているんだ。」















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

作者を応援しよう!

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

応援したユーザー

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