理解指向函数的指针有问题

时间:2011-08-31 18:11:25

标签: c++

我对大部分程序都很好,直到选择项的签名,其中有一个指向一个名为compare的函数的指针但我在这段代码中没有看到该函数。我想我想问的是如何比较工作?

// Fig. 8.20: fig08_20.cpp
// Multipurpose sorting program using function pointers.
#include <iostream>
#include <iomanip>
using namespace std;

// prototypes
void selectionSort( int [], const int, bool (*)( int, int ) );
void swap( int * const, int * const );   
bool ascending( int, int ); // implements ascending order
bool descending( int, int ); // implements descending order

int main()
{
   const int arraySize = 10;
   int order; // 1 = ascending, 2 = descending
   int counter; // array index
   int a[ arraySize ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };

   cout << "Enter 1 to sort in ascending order,\n" 
      << "Enter 2 to sort in descending order: ";
   cin >> order;
   cout << "\nData items in original order\n";

   // output original array
   for ( counter = 0; counter < arraySize; counter++ )
      cout << setw( 4 ) << a[ counter ];

   // sort array in ascending order; pass function ascending 
   // as an argument to specify ascending sorting order
   if ( order == 1 ) 
   {
      selectionSort( a, arraySize, ascending );
      cout << "\nData items in ascending order\n";
   } // end if

   // sort array in descending order; pass function descending
   // as an argument to specify descending sorting order
   else 
   {
      selectionSort( a, arraySize, descending );
      cout << "\nData items in descending order\n";
   } // end else part of if...else

   // output sorted array
   for ( counter = 0; counter < arraySize; counter++ )
      cout << setw( 4 ) << a[ counter ];

   cout << endl;
} // end main

// multipurpose selection sort; the parameter compare is a pointer to
// the comparison function that determines the sorting order
void selectionSort( int work[], const int size,
                    bool (*compare)( int, int ) )
{
   int smallestOrLargest; // index of smallest (or largest) element

   // loop over size - 1 elements
   for ( int i = 0; i < size - 1; i++ )
   {
      smallestOrLargest = i; // first index of remaining vector

      // loop to find index of smallest (or largest) element
      for ( int index = i + 1; index < size; index++ )
         if ( !(*compare)( work[ smallestOrLargest ], work[ index ] ) )
            smallestOrLargest = index;

      swap( &work[ smallestOrLargest ], &work[ i ] );
   } // end if
} // end function selectionSort

// swap values at memory locations to which 
// element1Ptr and element2Ptr point
void swap( int * const element1Ptr, int * const element2Ptr )
{
   int hold = *element1Ptr;
   *element1Ptr = *element2Ptr;
   *element2Ptr = hold;
} // end function swap

// determine whether element a is less than 
// element b for an ascending order sort
bool ascending( int a, int b )
{
   return a < b; // returns true if a is less than b
} // end function ascending

// determine whether element a is greater than 
// element b for a descending order sort
bool descending( int a, int b )
{
   return a > b; // returns true if a is greater than b
} // end f   return a > b; // returns true if a is greater than b

8 个答案:

答案 0 :(得分:4)

  

其中有一个指向比较

的函数的指针

void selectionSort( int work[], const int size,bool (*compare)( int, int ) ) compare中只是(最后)参数的本地名称。就像work是数组的本地名称(指针实际上......)一样,你作为第一个参数传入,compare是你传递它的函数指针的本地名称。

在此代码中,您将函数指针传递给ascendingdescending函数。

答案 1 :(得分:3)

Compare是参数的名称(变量名称)。它指向一个传递给sort函数的函数。您可以将升序或降序“比较器”函数作为此参数值传递,它将确定排序的方向。

答案 2 :(得分:2)

...精确

这称为函数指针。猜猜你应该阅读一些关于它的文档,因为你似乎对此不了解。

selectionSort函数将指向另一个函数的指针作为参数,以应用比较。

这意味着您必须声明此函数,并在使用selectionSort时将指针传递给它。

名称compare只是参数的名称。函数本身可以有任何名称。

答案 3 :(得分:1)

您的ascendingdescending函数(或更确切地说,指针)将作为compare参数传递给selectionSort函数。

答案 4 :(得分:1)

参数“compare”是指向函数的指针,可以是descendingascending

答案 5 :(得分:1)

compare ()函数只是一个函数,它接受两个参数(整数)并返回booltruefalse

通过在调用选择搜索功能时传递正确的函数来控制排序的顺序。此比较函数的地址可以是具有特定签名的任何内容,由选择排序函数接收,并在本地存储,名称为compare,后来用于确定是否进行交换,以便进行排序。

现在,如果你想按升序排序,你需要一个条件,而对于降序,你需要另一个条件(取决于你的代码)。您有两个函数接受条件运算符的两个操作数,它们根据条件运算符(您的ascendingdescending函数)返回true或false。将这些函数中的一个作为指针并调用它们使得排序具有通用性。根据您传递的函数,sort函数中调用compare的结果将不同,从而导致不同的排序顺序。

答案 6 :(得分:1)

该行:

(*compare)( work[ smallestOrLargest ], work[ index ] )

调用compare参数,该参数是传递给此处定义为的排序方法的函数的地址:

void selectionSort( int work[], const int size, bool (*compare)( int, int ) );

因此,当调用我帖子中的第一个代码行时,它实际上调用了升序或降序函数,因为升序和降序是传递给selectionSort的函数名称/地址。

答案 7 :(得分:1)

是的,函数/方法指针的语法很难阅读。

阅读建议

因此,我喜欢键入它们以便更轻松地阅读它们。

// OK this part is still hard to read
typedef bool (CompareFuncPtr*)( int, int );   

// But this is now eas(ier) to read.
void selectionSort( int [], const int, CompareFuncPtr compare);

用法(将函数作为参数传递)

回到原来的问题:
所以你有selectionSort()接受第三个参数比较:

  selectionSort( a, arraySize, ascending );

现在您可以看到它正在使用的功能是ascending 扫描您的代码我们在这里找到:

// determine whether element a is less than 
// element b for an ascending order sort
bool ascending( int a, int b )
{
   return a < b; // returns true if a is less than b
} // end function ascending

请注意,此函数的原型与函数指针定义匹配(将两个整数作为参数并返回bool)。如果函数类型与函数指针类型不匹配,则表示编译器错误。

调用(通过函数指针调用函数)。

如果你问它是怎么叫的:
看看这个功能:

void selectionSort( int work[], const int size, bool (*compare)( int, int ) )

第三个参数是比较 请注意我的版本更容易阅读。

因此,如果我们寻找比较使用:

     if ( !(*compare)( work[ smallestOrLargest ], work[ index ] ) )

基本上,通过指针调用函数的语法是:

ResultType result = (*funcPtr)(<ParameterList>);

在你的代码中,我们立即使用返回值而不是将其存储在变量中,但概念是相同的,传递的两个参数是:work[ smallestOrLargest ]work[ index ]我们假设它是一些整数值。

请注意。编译器检查函数指针调用的输入和输出的方式与检查对普通函数的调用的方式相同。传递的参数必须与预期参数匹配(与普通函数相同(因此您可以获得自动转换))并将结果视为适当的类型。