函数指针的定义格式
函数返回值类型 (*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并明确其指向函数入口