函数名作为参数,需要使用函数指针,下面就来看一下什么是函数指针
什么是函数指针
函数指针和指针、数组指针是一个系列的,它的本质是一个指针,指向一段内存,函数指针就是指向函数代码起始位置的地址
函数指针的声明
当声明一个函数指针时,必须声明它指向的函数类型,即函数的返回值类型,
void (* pf)(int, int); //pf是一个函数指针,它指向的函数类型为:返回值为void,参数列表为(int, int)
函数指针的赋值
函数名本身代表着函数的地址,因此给函数指针赋值使可以不用加&符号。
void func(int);//定义一个函数
void (*pf)(int);//定义一个函数指针
pf=func;//给函数指针赋值
函数指针的作用
- 用作函数别名
- 用指向函数的指针作为函数参数(本文目的)
以函数指针作为形参,就可以实现函数名作为参数,被另一个函数调用。
与指针函数的区别
指针函数:函数的返回值是指针类型的函数,使得返回值指向某个地址单元。
类型标识符 *函数名(参数表)
int *f(x,y);
其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。
比如要写一个函数,实现生成一个随机数组,故该函数的返回值为一个数组。而数组名本身为一个地址,因此可以一个指针函数来实现。
举例
以下是用指针函数生成一个随机数组,并返回该数组:
int *generateRandomArray(int n, int rangeL, int rangeR)
{
assert(rangeL <= rangeR);//#include<cassert>
int *arr = new int[n];
srand(time(NULL));//#include<ctime>
for (int i = 0; i < n; i++)
{
arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
}
return arr;
}
以下是用函数指针作为函数参数的例子:
template<typename T>
void testSort(string sortName, void(*sort)(T[], int),T arr[],int n)
{
//clock_t表示时钟周期的数据
clock_t startTime = clock();
sort(arr, n);
clock_t endTime = clock();
assert(isSorted(arr, n));
//两次时钟周期差表示算法真正执行的时钟周期,CLOCKS_PER_SEC每秒时钟周期个数
cout << sortName << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
return;
}
网友评论