函数指针,用typedef定义函数指针的好处,输出各中基本类型如int,char,float,double型中最大值

先看看没有定义函数指针的这道题,目的都是输出数组中最大值:

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值