函数指针_1

函数指针的定义格式

函数返回值类型 (*p) (函数参数)

比如 char * (* as_string)(ADT object)

描述:as_string是一个函数指针,指向的函数有一个类型为ADT的参数,该函数返回值类型时char *型

使用函数指针调用函数格式:as_string=function;(*as_string)(参数);

注意这里不能写为as_tring=function(),否则就是函数调用啦。

#include <iostream>
using namespace std;

int add(int,int);
int main()
{
    //(*p)表示p是一个函数指针,指向一个函数的入口,该函数有两个int类型的参数,返回值的类型也是int型
    int (*p)(int,int);
    int a,b,c;
    //该指针指向add函数的入口
    p=add;
    cout<<"Please enter two numbers:\n";
    cin>>a;
    cin>>b;
    //严格方法时(*p)(a,b),使用“*”引领直接调用后该函数
    //若使用p(a,b)将与函数本身调用无异
    c = (*p)(a,b);
    cout<<"The sum of two numbers is: "<<c<<endl;
    return 0;
}
int add(int a,int b)
{
    return a+b;
}

 例2:

main.cpp

#include <iostream>
#include <cstdlib>
using namespace std;

#include "arrmanip.h"

#define NUMBER_OF_ELEMENTS 8
#define LOWER 10
#define UPPER 99
//创建函数指针类型,其实就是比创建函数指针变量多了个typedef,以后一般使用函数指针类型来创建函数指针变量
typedef int(* COMPARE_OBJECT)(const void *e1,const void *e2);

int DoCompareObject(const void * e1,const void * e2);

int main()
{
    int a[NUMBER_OF_ELEMENTS];
    GenerateIntegers(a,NUMBER_OF_ELEMENTS,LOWER,UPPER);
    cout<<"Array generated at random as follows:\n";
    PrintIntegers(a,NUMBER_OF_ELEMENTS);
    /*================方法一:直接传入函数名(地址)作为函数参数========================*/
    // qsort(a,NUMBER_OF_ELEMENTS,sizeof(int),DoCompareObject);

    /*================方法二:定义函数指针变量进行传递================================*/
    // int (*compare)(const void *,const void *);
    // compare = DoCompareObject;
    // qsort(a,NUMBER_OF_ELEMENTS,sizeof(int),compare);

    /*================方法三:使用typedef定义函数指针变量类型==========================*/
    //创建函数指针类型变量compare并确定指向的函数入口地址
    COMPARE_OBJECT compare = DoCompareObject;
    // 使用函数指针作为函数参数
    //qsort四个参数,第一个基地址,第二个数组个数,第三个数组元素大小(字节单位),第四个比较函数
    //单独传递这个函数的名字,表示传递的时一个入口地址 
    qsort(a,NUMBER_OF_ELEMENTS,sizeof(int),compare);

    cout<<"After sorted:\n";
    PrintIntegers(a,NUMBER_OF_ELEMENTS);
    return 0;
}
int DoCompareObject(const void * e1,const void * e2)
{
    //将e1和e2都转换成const int *,然后调用CompareInteger来比较连个整数的大小关系
    //不能先引领再转换,因为引领之后时const void类型,而对于void和const void类型不能进行转换操作啊,非法
    //所以必须先对e1.e2进行类型转换成const int * 然后再引领,那么就相当于将两个数传进去而已
    return CompareInteger(*(const int *)e1,*(const int *)e2);
}

 arrmanip.cpp

#include<iostream>
using namespace std;
#include<iomanip>

#include "arrmanip.h"
#include "zyrandom.h"

// static const unsigned int lower_bound=10;
// static const unsigned int upper_bound=99;

void GenerateIntegers(int a[],unsigned int n,int lower,int upper)
{
    Randomize();
    for(int i=0;i<n;i++)
        a[i] = GenerateRandomNumber(lower,upper);
}

void PrintIntegers(int a[],unsigned n)
{
    for(int i=0;i<n;i++)
        cout<<setw(3)<<a[i];
    cout<<endl;
}

int CompareInteger(int x,int y)
{
    if(x>y)
        return 1;
    else if(x==y)
        return 0;
    else
        return -1;
}

arrmanip.h

void GenerateIntegers(int a[],unsigned int n,int lower,int upper);
int CompareInteger(int x,int y);
void PrintIntegers(int a[],unsigned int n);

zyrandom.h和zyrandom.cpp参考https://blog.csdn.net/Li_haiyu/article/details/81561980 

typedef int(* COMPARE_OBJECT)(const void *e1,const void *e2);表示定义了一种函数指针类型

int(* compare)(const void *e1,const void *e2);表示定义了函数指针的变量,只是一个变量

定义函数指针类型一般使用大写

compare = DoCompareObject; 给函数指针变量赋值使其指向具体的函数

COMPARE_OBJECT compare = DoCompareObject;创建一个函数指针类型变量compare并明确其指向函数入口

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/81706114