Reputation: 38173
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?
Upvotes: 10
Views: 2214
Reputation: 121397
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.
Upvotes: 17
Reputation: 153919
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()()
.
Upvotes: 2