通过函数指针调用函数 - 是否取消引用指针?有什么不同?

Kir*_*rov 7 c c++ function-pointers

我都尝试- 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
}
Run Code Online (Sandbox Code Playgroud)

那么,有什么区别

sort_ptr( arr1, 5 );
Run Code Online (Sandbox Code Playgroud)

(*sort_ptr)( arr2, 5 );
Run Code Online (Sandbox Code Playgroud)

两者似乎都工作(没有错误,没有警告,排序数组),我有点困惑.哪一个是正确的或两者都是正确的?

P.P*_*.P. 15

sort_ptr( arr1, 5 );
Run Code Online (Sandbox Code Playgroud)

(*sort_ptr)( arr2, 5 );
Run Code Online (Sandbox Code Playgroud)

两者都是正确的.事实上,你可以放置你想要的多个星号,它们都是正确的:

(*****sort_ptr)( arr2, 5 );
Run Code Online (Sandbox Code Playgroud)

函数名称衰减为指向函数的指针.所以重复解除引用会产生相同的指针.

  • 因为正式地,要调用函数,需要一个指向函数的指针,函数会隐式转换为指向函数的指针.每次添加`*`时,结果都是一个函数,它转换为指向函数的指针,这允许进一步的`*`. (5认同)