美文网首页
将函数名作为参数被另外一个函数调用

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

作者: showaichuan | 来源:发表于2017-08-09 19:22 被阅读0次

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

    什么是函数指针

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

    函数指针的声明

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

    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++ 函数指针 总结

    相关文章

      网友评论

          本文标题:将函数名作为参数被另外一个函数调用

          本文链接:https://www.haomeiwen.com/subject/pjmqrxtx.html