将函数名作为参数被另外一个函数调用

2017-08-09  本文已影响0人  showaichuan

函数名作为参数,需要使用函数指针,下面就来看一下什么是函数指针

什么是函数指针

函数指针和指针、数组指针是一个系列的,它的本质是一个指针,指向一段内存,函数指针就是指向函数代码起始位置的地址

函数指针的声明

当声明一个函数指针时,必须声明它指向的函数类型,即函数的返回值类型,

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;
    }

参考:C/C++ 函数指针 总结

上一篇下一篇

猜你喜欢

热点阅读