我尝试了 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 );
两种方法都似乎能正常工作(没有错误、没有警告、排序后的数组),我有点困惑。哪一种是正确的,还是两种方法都正确?
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?
*
- 可能是某种显式/隐式解引用(正如@Als在他的答案中所说),但为什么要允许那么多*
呢? - Kiril Kirov*
,结果是一个函数,它会转换为指向函数的指针,这允许进一步的*
操作。 - James Kanze