自作関数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)が付くのも自然な気がするね。」

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

作者を応援しよう!

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

応援したユーザー

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