自作関数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の関数ポインタ変数宣言がおこなわれているんだ。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます