1. ホーム
  2. c++

関数ポインタの再参照はどのように行われるのですか?

2023-09-14 21:10:52

質問

関数ポインタの再参照は、なぜ、どのように、ただ "何もしない" するのですか?

これは私が言っていることです。

#include<stdio.h>

void hello() { printf("hello"); }

int main(void) { 
    (*****hello)(); 
}


コメントより はこちら :

<ブロッククオート

関数ポインタのデリファレンスは しかし、結果としての関数 はすぐに 関数ポインタに変換されます。


また、回答から はこちら :

<ブロッククオート

関数のポインタを(あなたの考える方法で)再参照することは 関数のポインタを再参照することは CODE メモリを DATA メモリのようにアクセスすることです。 メモリにアクセスすることです。

関数ポインタは、そのような方法で参照解除されるとは そのような方法で参照されることはありません。その代わり が呼び出されます。

私なら、"dereference" という名前を並べて使うでしょう。 を"call"と並べます。大丈夫です。

とにかく C言語は 関数名の識別子も を保持する変数と ポインターは、CODEメモリへのアドレスという同じ意味を持ちます。 メモリへのアドレスです。そして、そのメモリにジャンプすることができます。 呼び出し()構文を使用することで、そのメモリにジャンプすることができます。 を使うことで、そのメモリにジャンプすることができます。


どのように まさに 関数ポインタのデリファレンスはどのように動作するのでしょうか?

どのように解決するのですか?

それは正しい質問ではありません。 少なくともC言語については、正しい問いは

rvalueコンテキストで関数値はどうなるのでしょうか?

(rvalueコンテキストとは、名前または他の参照が、場所ではなく、値として使用されるべき場所に現れることです - 基本的には、代入の左側を除く場所です。 名前自体は 右辺 -側)

では、rvalueコンテキストで関数値はどうなるのでしょうか? 元の関数値へのポインタに暗黙のうちに即座に変換されます。 そのポインタの参照を解除するには * でそのポインタを参照解除すると、また同じ関数値が返され、それは即座に暗黙のうちにポインタに変換されます。 そして、これは何度でも行うことができます。

2つの似たような実験を試すことができます。

  • の関数ポインタをデリファレンスするとどうなるか? lvalue コンテキスト(代入の左辺)で関数ポインタを再参照するとどうなりますか? (関数が不変であることを念頭に置けば、答えは予想通りでしょう)。

  • 配列の値もまた、lvalueコンテキストでポインタに変換されますが、それは 要素 型へのポインタに変換され、配列へのポインタには変換されません。 したがって、それを再参照すると、配列ではなく要素が得られ、あなたが示したような狂気は起こりません。

これが役立つことを願っています。

追伸 なぜ は暗黙のうちにポインタに変換されるのですが、その答えは、関数ポインタを使う人にとっては & を使わなくて済むので便利だからです。 呼び出し位置の関数ポインタは自動的に関数値に変換されるため、以下のように書く必要はありません。 * を書かなくても関数ポインタを介して呼び出すことができます。

P.P.S. Cの関数と違って、C++の関数はオーバーロードすることができ、私はC++でセマンティクスがどのように機能するかについてコメントする資格はありません。