Problem understanding a pointer to a function
<p>I'm fine with most of the program up until the signature  of selectionsort where there is a pointer to a function called compare but I don't see the function anywhere in this code. I guess what I'm trying to ask is how is compare working?</p>

<pre><code>// Fig. 8.20: fig08_20.cpp
// Multipurpose sorting program using function pointers.
#include &lt;iostream&gt;
#include &lt;iomanip&gt;
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 &lt;&lt; "Enter 1 to sort in ascending order,\n" 
      &lt;&lt; "Enter 2 to sort in descending order: ";
   cin &gt;&gt; order;
   cout &lt;&lt; "\nData items in original order\n";

   // output original array
   for ( counter = 0; counter &lt; arraySize; counter++ )
      cout &lt;&lt; setw( 4 ) &lt;&lt; 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 &lt;&lt; "\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 &lt;&lt; "\nData items in descending order\n";
   } // end else part of if...else

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

   cout &lt;&lt; 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 &lt; 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 &lt; size; index++ )
         if ( !(*compare)( work[ smallestOrLargest ], work[ index ] ) )
            smallestOrLargest = index;

      swap( &amp;work[ smallestOrLargest ], &amp;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 &lt; 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 &gt; b; // returns true if a is greater than b
} // end f   return a &gt; b; // returns true if a is greater than b
</code></pre>
