9

私は両方を試しました -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 );

どちらも機能しているようで (エラーなし、警告なし、並べ替えられた配列)、ちょっと混乱しています。どちらが正しいですか、それとも両方とも正しいですか。

4

2 に答える 2

15
sort_ptr( arr1, 5 );

(*sort_ptr)( arr2, 5 );

どちらも正しいです。実際、好きなだけアスタリスクを付けることができ、それらはすべて正しいです:

(*****sort_ptr)( arr2, 5 );

関数の名前は、関数へのポインターに崩壊します。したがって、繰り返し逆参照すると、同じポインターが生成されます。

于 2012-11-20T11:45:53.513 に答える
2

コンパイラに関する限り、sort_ptrそして(*sort_ptr)同一です。sort_ptrただし、実際にポインタである場合は、明示的に逆参照すると、読者にとって非常に明確になります。一般に; 関数へのポインタで関数を直接呼び出すことができるという事実が役立つ場合が1つあります。テンプレートでは、関数オブジェクトへのポインタを作成します。これは、。を持つクラスとまったく同じように動作しますoperator()()

于 2012-11-20T11:49:29.080 に答える