指针函数和函数指针

概述

指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。
其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。

指针函数

指针函数: 顾名思义,它的本质是一个函数,不过它的返回值是一个指针。

其声明的形式如下所示:

char *getword(char c)

其中,func是一个函数,args是形参列表,ret *作为一个整体,是 func函数的返回值,是一个指针的形式。
下面举一个具体的实例来做说明:

#include<stdio.h>
char *getword(char);
char *getword(char c)
{
        switch(c) {
                case 'A':return "banana";
                case 'B':return "banana";
                case 'C':return "banana";
                case 'D':return "banana";
                default: return "None";
        }

}


int main()
{
        char c;
        printf("input one char\n");
        scanf("%c",&c);

        printf("%s\n",getword(c));

        return 0;
}

 注意 :不要返回局部变量的指针;

函数指针

与指针函数不同,函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。
我们知道,函数的定义是存在于代码段,因此,每个函数在代码段中,也有着自己的入口地址,函数指针就是指向代码段中函数入口地址的指针。
其声明形式如下所示:

int (*fp)(int num);

下面还是以一个简单的例子来具体说明一下函数指针的应用:

#include<stdio.h>

int square(int num)
{

return num*num;

}
int main()
{
int num;
int (*fp)(int num);
printf("input one number\n");
scanf("%d",&num);
 fp=square; //fp=&square()
 printf("%d * %d = %d\n",num,num,(*fp)(num));
 fp=square;


return 0;
}

 函数指针作为参数:

#include<stdio.h>
int add(int num1,int num2)
{
return num1+num2;
}
int sub(int num1,int num2)
{
return num1-num2;
}
int cacl(int (*fp)(int ,int),int num1,int num2)
{
return (*fp)(num1,num2);
}

int main()

{
int a=5;
int b=3;
printf("5+3=%d\n",cacl(add,a,b));
printf("5-3=%d\n",cacl(sub,a,b));

return 0;
}

运行结果:

sunshine@ubuntu:~/text$ gcc text3.c && ./a.out
5+3=8
5-3=2

函数指针作为返回值

#include<stdio.h>


int add(int num1,int num2)
{
return num1+num2;
}
int sub(int num1,int num2)
{
return num1-num2;
}
int cacl(int (*fp)(int ,int),int num1,int num2)
{
return (*fp)(num1,num2);
}
int (*select(char op ))(int ,int )  // *select(char op) 先执行,返回一个指针之后形成(*)(int ,int )的函数指针
{


         switch(op){
                 case '+':return add;
                 case '-':return sub;


         }

}
int main()
{
int num1,num2;
char op;
int (*fp)(int,int );
printf("please input ex:2+3\n");
scanf("%d%c%d",&num1,&op,&num2);
fp=select(op); //将select返回的函数指针放到fp中
printf("%d%c%d=%d\n",num1,op,num2,cacl(fp,num1,num2));
return 0;
}
~                    


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值