先看看没有定义函数指针的这道题,目的都是输出数组中最大值:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
void * intMax(void * arg,int nCount)
{ int * agu=(int *)arg;
static int Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * floatMax(void * arg,int nCount)
{ float * agu=(float *)arg;
static float Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * doubleMax(void * arg,int nCount)
{ double* agu=(double *)arg;
static double Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * charMax(void * arg,int nCount)
{ char* agu=(char *)arg;
static char Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void main()
{ /* int a[]={3,2,56,45,78};
void * result=intMax(a,5);
cout<<*((int *)result)<<endl;*/
// float a[]={3.34f,2.34f,56.45f,45.32f,78.3456f};
//void * result=floatMax(a,5);
//cout<<*((float*)result)<<endl;
// double a[]={3.34,2.34,56.45,45.32,78.3456};
//void * result=doubleMax(a,5);
//cout<<*((double*)result)<<endl;
char a[]={'A','a','h','f','B'};
void * result=charMax(a,5);
cout<<*((char*)result)<<endl;
}
观察观察者几个函数是不是有共同点:
(1)函数的返回值是某种类型的值而已
(2)函数参数也是一样的,仅仅只是函数名不一样,虽然c中不存在函数重载形式,但是c++可以,比如下面这段代码在c中不行即在.c文件中不能运行,因为c语言不支持
函数重载,但在.cpp文件中可以
#include<stdio.h>
int max(int a,int b)
{
return a>b?a:b;
}
float max(float a,float b)
{
return a>b?a:b;
}
void main()
{
int res=max(3,4);
int res1=max(3.0f,4.0f);
printf("%d\n",res);
printf("%d\n",res1);
}
注意把float max函数换个名字就能行如float max1(flaot a,float b)
又看一个有意思的题
在.cpp文件中下面的程序验证没问题
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef void * (*pFun)(void *,int);
void * intMax(void * arg,int nCount)
{ int * agu=(int *)arg;
static int Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * floatMax(void * arg,int nCount)
{ float * agu=(float *)arg;
static float Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * doubleMax(void * arg,int nCount)
{ double* agu=(double *)arg;
static double Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * charMax(void * arg,int nCount)
{ char* agu=(char *)arg;
static char Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void main()
{ /* int a[]={3,2,56,45,78};
void * result=intMax(a,5);
cout<<*((int *)result)<<endl;
float a[]={3.34f,2.34f,56.45f,45.32f,78.3456f};
void * result=floatMax(a,5);
cout<<*((float*)result)<<endl;*/
double a[]={3.34,2.34,56.45,45.32,78.3456};
void * result=doubleMax(a,5);
cout<<*((double*)result)<<endl;
char a1[]={'A','a','h','f','B'};
void * result1=charMax(a1,5);
cout<<*((char*)result1)<<endl;
}
但是把他放到.c文件中出现了问题,经过改正如下。
在.c文件中改成这样可以
#include<string.h>
#include<stdio.h>
typedef void * (*pFun)(void *,int);
void * intMax(void * arg,int nCount)
{ int * agu=(int *)arg;int i;int pos;
int Max=*agu;
for( i=1;i<nCount;i++)
if(Max<*(agu+i))
{
Max=*(agu+i);
pos=i;
}
else
continue;
//return &Max;
return (void*)(agu+pos);;//解决返回局部地址警告
}
void * floatMax(void * arg,int nCount)
{ float * agu=(float *)arg;
float Max=*agu;int i;
for( i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return (void *)(agu+i);
}
void * doubleMax(void * arg,int nCount)
{
double* agu=(double *)arg;
double Max=*agu;int i;
int pos;
for( i=1;i<nCount;i++)
if(Max<*(agu+i))
{
Max=*(agu+i);
pos=i;
}
else
continue;
return (void*)(agu+pos);
}
void * charMax(void * arg,int nCount)
{ char* agu=(char *)arg;
char Max=*agu;int i,pos;
for( i=1;i<nCount;i++)
if(Max<*(agu+i))
{Max=*(agu+i);
pos=i;
}
else
continue;
return (void*)(agu+pos);
}
void main()
{
// float a[]={3.34f,2.34f,56.45f,45.32f,78.3456f};
// void * result=floatMax(a,5);
//cout<<*((float*)result)<<endl;
char a1[6]={'A','a','h','f','B'};
double a[]={3.34,2.34,56.45,45.32,78.3456};
int a2[]={3,2,56,45,78};
void * result2=intMax(a2,5);
void * result=doubleMax(a,5);
void * result1=charMax(a1,5);
printf("%d\n",*((int*)result2));
printf("%f\n",*((double*)result));
printf("%c\n",*((char*)result1));
}
当使用函数指针后的好处:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef void * (*pFun)(void *,int);
void * intMax(void * arg,int nCount)
{ int * agu=(int *)arg;
static int Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * floatMax(void * arg,int nCount)
{ float * agu=(float *)arg;
static float Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * doubleMax(void * arg,int nCount)
{ double* agu=(double *)arg;
static double Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
void * charMax(void * arg,int nCount)
{ char* agu=(char *)arg;
static char Max=*agu;
for(int i=1;i<nCount;i++)
if(Max<*(agu+i))
Max=*(agu+i);
else
continue;
return &Max;
}
pFun search_fun(char ch)//这个函数的作用就是动态的匹配具体的函数
{ pFun fun=NULL;
switch(ch)
{
case 'i':
fun=intMax;
break;
case 'f':
fun=floatMax;
break;
case 'd':
fun=doubleMax;
break;
case 'c':
fun=charMax;
break;
default:
fun=NULL;
break;
}
return fun;
}
void main()
{ /* int a[]={3,2,56,45,78};
void * result=intMax(a,5);
cout<<*((int *)result)<<endl;
float a[]={3.34f,2.34f,56.45f,45.32f,78.3456f};
void * result=floatMax(a,5);
cout<<*((float*)result)<<endl;*/
/*double a[]={3.34,2.34,56.45,45.32,78.3456};
void * result=doubleMax(a,5);
cout<<*((double*)result)<<endl;
char a1[]={'A','a','h','f','B'};
void * result1=charMax(a1,5);
cout<<*((char*)result1)<<endl;*/
pFun fun=NULL;
fun=search_fun('c');//可以看做是为找到真正的函数搭的一座桥
char a1[]={'A','a','h','f','B'};
void * result1=(*fun)(a1,5);//这才是真正的函数调用
cout<<*((char*)result1)<<endl;
}