Calling a function through a function pointer - dereference the pointer or not? What's the difference?

百般思念 提交于 2019-12-18 05:57:36

问题


I tried both - C and C++ and both work fine.

I'm kinda new to function pointers and here's a simple code, that surprised me:

#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
}

So, what's the difference between

sort_ptr( arr1, 5 );

and

(*sort_ptr)( arr2, 5 );

Both seems to work (no errors, no warnings, sorted arrays) and I'm kinda confused. Which one is the correct one or they both are correct?


回答1:


sort_ptr( arr1, 5 );

and

(*sort_ptr)( arr2, 5 );

Both are correct. In fact, you can put as many asterisks you want and they are all correct:

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

The name of function decays to a pointer to a function. So dereferencing it repeatedly is going to produce the same pointer.




回答2:


As far as the compiler is concerned, sort_ptr and (*sort_ptr) are identical. If sort_ptr really is a pointer, however, explicitly dereferencing it makes things a lot clearer for the reader. In general; there is one case where the fact that you can call a function directly on a pointer to function is useful: in templates, where it makes a pointer to function a functional object, which behaves exactly like a class with an operator()().



来源:https://stackoverflow.com/questions/13472443/calling-a-function-through-a-function-pointer-dereference-the-pointer-or-not

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!