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

标签 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
}

那么,

之间有什么区别呢?
sort_ptr( arr1, 5 );

(*sort_ptr)( arr2, 5 );

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

最佳答案

sort_ptr( arr1, 5 );

(*sort_ptr)( arr2, 5 );

两者都是正确的。事实上,您可以输入任意数量的星号,它们都是正确的:

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

函数名衰减为指向函数的指针。因此反复取消引用将产生相同的指针。

关于c++ - 通过函数指针调用函数 - 是否取消引用指针?有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13472443/

相关文章:

c++ - apache 服务器上的 fcgi 与 mod_fastcgi

c++ - 如何从点云中获取 rgb 值

c - 为什么将调用者堆栈的局部变量保存在被调用者堆栈的寄存器中?

c++ - 将指向成员函数的指针作为 void* 函数的参数传递

c++ - 为什么我的模板需要 C++ 链接?

c++ - 仅从一个模板参数查找特定模板。是否可以?

c - AVX-512 中 undefined reference

c - 将 0x00 分配给 C 中的数组?

c++ - 这个语句代表什么 [func ptr]

c++ - 比较成员函数的 std::function