[英]Calling a function through a function pointer - dereference the pointer or not? What's the difference?
我尝试了C
和C++
,两者都工作正常。
我对函数指针有点陌生,这里有一个简单的代码,让我感到惊讶:
#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 );
函数的名称衰减为指向函数的指针。 所以反复取消引用它会产生相同的指针。
就编译器而言, sort_ptr
和(*sort_ptr)
是相同的。 但是,如果sort_ptr
确实是一个指针,那么显式取消引用它会使读者更清楚。 一般来说; 在一种情况下,您可以直接在指向函数的指针上调用函数这一事实很有用:在模板中,它使指向函数的指针成为功能对象,其行为与带有operator()()
的类完全相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.