关于函数指针和指针函数的分析

 关于函数指针和指针函数的分析

指针函数

它本质是一个函数,返回值是某一类型的指针。

看定义,首先它是一个函数,而且它必须有一个返回值,并且该返回值是某一类型的指针。该指针的类型必须与函数类型相同。

定义格式: 类型名 *函数名(函数的参数)
                        
                          char * strstr(const char *str1,const char *str2);

由于 * 的优先级低于(),所以函数名strstr先与()结合,表面这是一个函数,再与 * 以及 char 结合,表面该函数的返回值为一个char类型的指针。

注:指针函数的返回值为指针,该指针指向返回值,内部存储的是返回值的地址。

下面看一个例子:


<span style="font-size:18px;">#include<stdio.h>
#include<assert.h> 
 
char *my_strcat( char *dest, const char *src)
 //学会用const保护参数
   {
    assert(*dest!=NULL);
    assert(*src!=NULL);
 //assert判断*dest与*src是不是为空,若为空,以下程序则不再执行。
    char*tmp=dest;
   //建立一个指针变量保存原指针的地址
    while(*dest)
    {
    dest++;
}
while(*dest++=*src++)
{
 ;
}
return tmp;//最后返回一个类型为char*的指针
//dest一直在++,最后变成‘\0’,所以返回时要注意不能再返回dest(return dest)
   }
 int main()
  {
  char arr[20]="Hello";
 //定义时一定要注意空间问题,原数组空间一定要大于等于拷贝后的空间,不然可能会造成越界。
  char arr2[]="bit";
  char *tmp=my_strcat(arr,arr2);//这里同样用一个char*的指针来接受这个返回值。
  printf("%s",tmp);
  return 0;
}</span>


注意:在主函数中应该建立一个同类型的指针来接受这个返回值。


函数指针


顾名思义,它的本质是一个指针,是一个指向函数的指针变量。 每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。

用途:调用函数和做函数的参数。

定义格式:类型名(*指针名)(参数列表)

                    int (*fun)(int ,int );

  同指针函数,*  的优先级小于(),所以用()将 * 和指针变量名fun括起来,表名它是一个指针,再与(int,int)和 int 结合,表名该指针必须指向一个形参是两个整形,并且类型为 int 的函数。

函数指针的赋值方法可以有两种。例如:

<span style="font-size:18px;">int max(int a,int b);
int (*fun)(int ,int );
int (*fuc)(int,int);
fun=max;//  1
fuc=&max;//  2</span>

注:在赋值时,函数max不带参数,此时max就相当于函数的首地址,fun或fuc就指向max(a,b)这个函数的首地址。



我们还可以用typedef来声明函数指针。

1、先用typedef来定义函数指针类型。

          tepydef  int(*fun)(int ,int );

2、当我们以后多次用到函数指针时可以直接用fun定义声明。
     
    fun max_u=max(int a,int b);
    fun add_u=add(int a,int b);


下面看一个函数指针的应用举例:

<span style="font-size:18px;">#include<stdio.h>
typedef int(*fun)(int ,int );//typedef定义完之后一定要加分号
  int add(int a,int b)
  {
  	int c=a+b;
  	return c;
  }
  int max(int x,int y)
  {
  	return x>y?x:y;
   } 
 int main() 
   {
   	fun max_u=max;//直接用fun来定义函数指针
   	fun add_u=add;
   	printf("%d  %d",max_u(1,2),add_u(1,2));
   	return 0;
   }</span>

注: 1、函数指针的类型与其所指向的函数的类型必须相同。
        2、函数指针的参数类型,个数必须与其所指向的函数的参数类型,个数相同。





函数指针数组。

这个我们直接看它的标准定义方法:

首先它是一个数组。                                                               数组名[]                                              a[]
这个数组的数据类型为指针。                                                *数组名[]                                            *a[]
这些指针所指向的对象为某一类型的函数。                          类型名 (*数组名[])(形式参数)            int(*a[])(int,int)







注:优先级问题这里便不再说,不懂得请向上翻阅,或自行查询资料。



关于函数指针数组的定义方法还有一种叫,蒙骗法。感兴趣的请自己百度。笔者建议大家用标准方法,可读性比较高。



下面来看一个应用举例:
 
还是上面的例子,我们把它改变一下。

<span style="font-size:18px;">#include<stdio.h>
  int add(int a,int b)
  {
  	int c=a+b;
  	return c;
  }
  int max(int x,int y)
  {
  	return x>y?x:y;
   } 
 int main() 
   {
    int (*fun[2])(int,int);//定义一个函数指针数组
    fun[0]=max;//赋值
    fun[1]=add;
   	printf("%d  %d",fun[0](1,2),fun[1](1,2));//调用
   	return 0;
   }</span>



关于定义声明,在这里做一点补充,可以仿照数组初始化方法,

          int (*fun[])(int ,int)={max,add};








指向函数指针数组的指针

笔者目前还没用过这种指针,不过我认为指向函数指针数组的指针为一个三级指针。
定义应该类似于
     
     int ***arr=(*fun[])(int,int);

这只是我一时的想法,等我查阅资料后会对该内容做一定补充。
     
   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值