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?
As far as the compiler is concerned,
sort_ptr
and(*sort_ptr)
are identical. Ifsort_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 anoperator()()
.and
Both are correct. In fact, you can put as many asterisks you want and they are all correct:
The name of function decays to a pointer to a function. So dereferencing it repeatedly is going to produce the same pointer.