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真的是一个指针,那么显式地取消引用它会让读者更清楚。一般来说; 在一种情况下,您可以直接在指向函数的指针上调用函数这一事实很有用:在模板中,它使指向函数的指针成为函数对象,其行为与带有operator()().

于 2012-11-20T11:49:29.080 回答