概述
指针函数和函数指针是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;
}
~