関数ポインタの再参照はどのように行われるのですか?
質問
関数ポインタの再参照は、なぜ、どのように、ただ "何もしない" するのですか?
これは私が言っていることです。
#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++でセマンティクスがどのように機能するかについてコメントする資格はありません。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】C++の余分な資格エラー
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む