通过函数指针调用的函数 - 取消引用指针或不是? 有什么不同?(Calling a functi

2019-07-04 00:25发布

我都尝试- CC++两者做工精细。

我有点新的函数指针,这里是一个简单的代码,这让我感到惊讶:

#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 );

双方似乎工作(没有错误,没有警告,有序阵列)和我有点困惑。 哪一个是正确的还是他们俩是正确的?

Answer 1:

sort_ptr( arr1, 5 );

(*sort_ptr)( arr2, 5 );

两者都是正确的。 事实上,你可以把尽可能多的星号你想和他们是正确的:

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

函数的名称衰变为指针的函数。 所以取消引用它一再将要产生相同的指针。



Answer 2:

至于编译器而言, sort_ptr(*sort_ptr)是相同的。 如果sort_ptr真的是一个指针,但是,明确提领它使事情让读者更清晰了很多。 一般来说; 有一个的情况下,你可以在一个指针函数直接调用的函数的事实是很有用的:在模板,在那里它使一个指针功能的功能对象,它的行为完全像一类具有一个operator()()



文章来源: Calling a function through a function pointer - dereference the pointer or not? What's the difference?