私は両方を試しました - C
とC++
と両方とも正常です。関数ポインタを使用して関数を呼び出す - ポインタを逆参照するかどうか違いは何ですか?
私は関数ポインタにちょっと新たなんだと、ここで私を驚かせた簡単なコード、です:
#include <assert.h>
void sort(int* arr, const int N);
int main()
{
int arr1[] = { 1, 5, 2, 6, 2 };
int arr2[] = { 1, 5, 2, 6, 2 };
void (*sort_ptr)(int*, const int) = sort;
sort_ptr(arr1, 5);
(*sort_ptr)(arr2, 5);
assert(arr1[0] == 1 && arr1[1] == 2 && arr1[2] == 2 &&
arr1[3] == 5 && arr1[4] == 6);
assert(arr2[0] == 1 && arr2[1] == 2 && arr2[2] == 2 &&
arr2[3] == 5 && arr2[4] == 6);
return 0;
}
void sort(int* arr, const int N)
{
// sorting the array, it's not relevant to the question
}
をので、
sort_ptr(arr1, 5);
と
(*sort_ptr)(arr2, 5);
の違いは何だが、どちらもうまくいくようです(エラーも警告もソートされていません)、ちょっと混乱しています。どちらが正しいか、どちらが正しいですか?
なぜ*****好きなだけ多く説明できますか? – Omkant
うわー、それは私には本当に不思議です。なぜ言語はこれを許すのだろうか? OK、私は1つの '*'を使っても問題ありません - 何らかの明示的/暗黙的逆参照(@Alsが彼の答えで述べたように)ですが、何故多くの '*'を許可するのでしょうか? –
正式には、関数を呼び出すには関数へのポインタが必要です。関数は関数へのポインタを暗黙的に変換します。あなたが '*'を追加するたびに、結果は関数へのポインタに変換されます。関数へのポインタに変換され、さらに '*'が可能になります。 –