Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解函数指针的问题_C++ - Fatal编程技术网

C++ 理解函数指针的问题

C++ 理解函数指针的问题,c++,C++,在selectionsort签名之前,我对大部分程序都很满意,其中有一个指向名为compare的函数的指针,但我在代码的任何地方都看不到该函数。我想我想问的是比较是如何工作的 // Fig. 8.20: fig08_20.cpp // Multipurpose sorting program using function pointers. #include <iostream> #include <iomanip> using namespace std; // pr

在selectionsort签名之前,我对大部分程序都很满意,其中有一个指向名为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.20:fig08\u 20.cpp
//使用函数指针的多用途排序程序。
#包括
#包括
使用名称空间std;
//原型
void selectionSort(int[],const int,bool(*)(int,int));
无效交换(int*const,int*const);
布尔升序(int,int);//实现升序
布尔递减(int,int);//实现降序
int main()
{
常数int arraySize=10;
整数顺序;//1=升序,2=降序
int计数器;//数组索引
inta[arraySize]={2,6,4,8,10,12,89,68,45,37};
不能排序;

cout您的
升序
降序
函数(或者更确切地说,指向它们的指针)作为
比较
参数传递给
选择排序
函数。

参数“比较”是指向函数的指针,可以是
降序
升序

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

精确地

这叫做函数指针。我想你应该阅读一些关于它的文档,因为你似乎不知道这一点

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

这意味着您必须声明此函数,并在使用
selectionSort
时传递指向该函数的指针

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

其中有一个指向名为compare的函数的指针

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

在这段代码中,您将函数指针传递给它,指向
升序
降序
函数。

compare()
函数只是一个接受两个参数(int)并返回
bool
true
false
的函数

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

现在,如果要按升序排序,则需要一个条件;如果按降序排序,则需要另一个条件(取决于代码)。有两个函数接受条件运算符的两个操作数,它们根据条件运算符返回true或false(您的
升序
降序
函数)。获取其中一个函数作为指针并调用它们使排序变得通用。根据您在排序函数中传递的调用结果
比较
,排序顺序将不同。

行:

(*compare)( work[ smallestOrLargest ], work[ index ] )
调用compare参数,该参数是传递给sort方法的函数的地址,此处定义为:

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

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

是的,函数/方法指针的语法很难理解

阅读建议 因此,我喜欢对它们进行类型定义,以便更容易地阅读它们的用法

// 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 );
因此,现在您可以看到它使用的函数是升序的

扫描您的代码,我们在此处找到:

// 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
第三个参数是比较。
请注意我的版本如何更易于阅读

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

     if ( !(*compare)( work[ smallestOrLargest ], work[ index ] ) )
基本上,通过指针调用函数的语法是:

ResultType result = (*funcPtr)(<ParameterList>);
ResultType result=(*funcPtr)();
在您的代码中,我们立即使用返回值,而不是将其存储在变量中,但概念是相同的,传递的两个参数是:
work[smallestOrLargest]
work[index]
,我们假设它们是一些整数值


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

我不确定我是否理解。.代码已经编译,为什么我需要修复任何东西?如前所述,不允许在没有注释的情况下进行downvote。这是一个非常好的问题。请在中进行注释,然后使用downvote收回。尽管标题仍然很糟糕。@pst标题并不完美,但有一些问题mes为了写出一个好的标题,你需要知道答案。在这种情况下,你会用什么作为标题(假设你不明白代码中发生了什么)?
ResultType result = (*funcPtr)(<ParameterList>);