私は2つの宣言の違いがあるかを理解したいと、思いf1
とf2
以下、:でf1
私はパラメータの型の関数へのポインタであることを宣言しvoid()
ているか、f2
宣言が異なりますかf1
?宣言は同等ですか?でmain
私はプロトタイプの関数でそれらの両方を呼び出すことができvoid ()
ます。値/ポインタ/参照を渡すという概念は理解していますが、これらは関数であり、実際には違いを理解していません。パラメータとして渡された関数を「変更」できるわけではありませんf1
...ありがとうございます。
PS:よく知られているMost VexingParsingの問題にぶつかったときにこの質問がありました:)
#include <iostream>
using namespace std;
void f1(void (*x)())
{
x();
}
void f2(void x())
{
x();
}
void g1()
{
cout << "Invoking f1(g1())" << endl;
}
void g2()
{
cout << "Invoking f2(g2())" << endl;
}
int main()
{
f1(g1);
f2(g2);
}
プログラムがコンパイルされ、出力は次のようになります。
Invoking f1(g1())
Invoking f2(g2())
それらは同等です。引数で発生する暗黙的なポインタ変換に混乱しています。
関数を引数として関数に渡すことはできないため(Cの関数では、関数を呼び出すかアドレスを取得する以外に何もできません)、コンパイラーは引数を関数へのポインターにサイレントに変更します。
これは、配列の場合とほとんど同じです。配列を関数の引数として渡すこともできないため、関数の引数を配列として宣言すると、サイレントにポインターに変更されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加