自作関数newmadefunctionの命令文を格納している先頭のメモリのアドレスを格納する関数ポインタ変数を作製してみよう。その2
ソーラー
「自作関数newmadefunctionの命令文を
格納している先頭のメモリのアドレス
を格納する
関数ポインタ変数の名前をptfに設定します。
(関数ポインタ変数名は 自由に設定することができます)
自作関数newmadefunctionの命令文を格納している
先頭のメモリのアドレスを
関数ポインタ変数ptfに代入すれば
*ptf
は
自作関数newmadefunction
をあらわしていることになり
*ptf
を用いて
自作関数newmadefunctionを
呼び出して使用することができるようになります。
と概要がわかったところで
自作関数newmadefunctionの命令文を
格納している先頭のメモリのアドレス
を格納する
関数ポインタ変数を作製してみよう。
その2
だね
先程は
自作関数
int newmadefunction(int x){
printf("%d円GETしました\n",x);
return ;
}
が
コンパイル後
機械語に翻訳されてメモリに格納されたとき
この機械語に翻訳された自作関数newmadefunctionの命令文を
格納している先頭のメモリのアドレスを格納する
関数ポインタ変数ptfは
関数ポインタ変数宣言
int (*ptf)(int x);
で作製されることがわかったよね。」
アレサ「自作関数といってもメモリに格納されるのですから
そのメモリにはアドレスがあり
そのアドレスを格納することのできるポインタ変数
つまり
関数ポインタ変数があるというわけなのですの。」
ソーラー「そうなんだ。ポインタ変数って応用範囲がひろいね。
メモリに直接アクセスすることができるからかな?
次は
自作関数の定義が
int newmadefunction(int x){
printf("%d円GETしました\n",x);
return ;
}
でなく
void newmadefunction(void){
printf("青い海です\n");
return ;
}
の場合
この自作関数がコンパイル後
機械語に翻訳されてメモリに格納された場合
この機械語に翻訳された
自作関数newmadefunctionの命令文を
格納している先頭のメモリのアドレスを格納する
関数ポインタ変数ptf(関数ポインタ変数名をptfとした場合)は
どのような
関数ポインタ変数宣言により作製されるかということだよね。
自作関数の定義が
void newmadefunction(void){
printf("青い海です\n");
return ;
}
だから
関数ポインタ変数宣言が
int (*ptf)(int x)
ってことはなさそうだよね。\(^o^)/」
アレサ「そうですの
intは自作関数にまったく使われていないのですの。」
ソーラー「そうなんです。
int型に自作関数newmadefunctionの戻り値が格納されるとき
自作関数newmadefunctionのアドレスを格納する関数ポインタ変数ptfは
int *(イントアスタリスク型)に格納されました。
同様に
void型に自作関数newmadefunctionの戻り値が格納されるとき
自作関数newmadefunctionのアドレスを格納する関数ポインタ変数ptfは
void*(ヴォイドアスタリスク型)に格納されます。(´▽`*)
つまり
ptfの関数ポインタ変数宣言は
void(*ptf)(void);
となります。
自作関数の引数の(void)も(*ptf)に続けて記述する仕組みとなっています
別の見方をするなら
プログラムがコンパイルされると
自作関数newmadefunctionを構成する機械語は
メモリに格納されることになりますが
自作関数newmadefunctionを構成する機械語が実行されたときの
自作関数newmadefunctionの戻り値は
自作関数の定義が
void newmadefunction(void){
printf("青い海です\n");
return ;
}
なので
void型に格納されます。
つまり
voidはデータをメモリに格納しない型なので
自作関数newmadefunctionの戻り値はメモリに格納されないのです。
となると
自作関数 newmadefunctionと等しい働きをする*ptf
が実行されたときの戻り値も
void型に格納されるといえます。
つまり
この場合も
戻り値は
メモリに格納されないのです。
関数ポインタ変数宣言
void(*ptf)(void);
をみてみると
*ptfが
void型に格納されているように見えますね。
つまり
変数宣言
int a;
により作成された変数aのアドレス&aを
ポインタ変数宣言
int *pta;
により作成された
ポインタ変数ptaに代入すると
*ptaは変数aと等しい働きをするから
*ptaは
ポインタ変数宣言
int *pta;
と
記述されるように
*ptaはint型に格納されると言っているのと同じことなんだ。
そして
*ptfが自作関数newmadefunctionに等しい働きをするなら
自作関数の定義で
void newmadefunction(void)
と記述されていたように
関数ポインタ変数宣言
void(*ptf)(void);
で
(*ptf)に引数の部分である(void)が付くのも自然な気がするね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます