指针函数和函数指针的理解笔记
敲黑板!!!
指针函数返回指针,而函数指针存储函数的地址,是用来指向函数的
指针函数
定义指针函数:GetBookNam,功能是通过编号获取书名
/*
* 定义全局变量指针数组,每一个元素都是一个指针,指向字符串的指针
* Str[0]指向的是字符串"c程序设计"
* Str[1]指向的是字符串"c与指针"
* ...
*/
char *Str[] = {
"c程序设计",
"c与指针",
"c陷阱与缺陷",
"非法编号"
};
//指针函数,函数返回的是指向字符串的指针
char *GetBookNam(char Ind)
{
if ((0 == Ind)||(Ind>2))
{
return Str[3];
}
else
{
//-1 就是让输入编号1的时候指向Str[0]所指位置
return Str[Ind-1];
}
}
int main (void)
{
char BookInd;
printf("请输入你要找的书的编号(如1):");
scanf("%d",&BookInd);
printf("改编号的书名是:%s\n",GetBookNam(BookInd));
return 0;
}
运行结果如下图所示:
函数指针
函数指针是指向函数的指针,即它存储了函数的地址
int add(int x, int y)
{
return x + y;
}
int main()
{
//定义函数指针p,这个指针指向的函数有两个int变量的形参
int (*p)(int, int);
//让指针函数指向add函数
p = add;
//通过函数指针直接调用add函数,以下两种调用都可以
printf("2+4= %d \n",p(2,4));
//这种形式的调用比较直观,一看就知道p是一个函数指针
//printf("2+4= %d \n",(*p)(2,4));
}
如上代码:通过函数指针p调用add函数,我们并没有看出来函数指针的优势,程序效率也没有直接调用函数add来的效果高,接下来我们来看看函数指针的大用途。
1)函数指针作为形参传递,大大提高程序灵活性
int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}
/*
*定义一个函数,这个函数有3个形参
*形参1-->>函数指针pFun指向的函数是一个带有两个整形变量,且返回值是int型变量,简单说形参1,就是一个函数地址
*形参2-->>
*形参3-->>
*注:形参1定义的函数指针满足指向add和sub函数的要求,返回整形,有两个int型变量作为形参
*/
int calc(int (*pFun)(int,int),int x,int y)
{
return pFun(x,y);
}
int main()
{
printf("验证calc函数:2+4 = %d\n",calc(add,2,4));
printf("验证calc函数:2-4 = %d\n",calc(sub,2,4));
return 0;
}
代码运行结果如下:
2)函数指针作为返回值,当有时候不确定具体调用哪个函数,只有在某一事件发生后才确定,这时我们事先可以定义一个函数指针(比如回调函数)
int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}
/*
*定义一个函数,这个函数有3个形参
*形参1-->>函数指针pFun指向的函数是一个带有两个整形变量,且返回值是int型变量,简单说形参1,就是一个函数地址
*形参2-->>
*形参3-->>
*注:形参1定义的函数指针满足指向add和sub函数的要求,返回整形,有两个int型变量作为形参
*/
int calc(int (*pFun)(int,int),int x,int y)
{
return pFun(x,y);
}
//定义一个返回值是函数指针的函数select
/*
*解读:看(*select(char op)),由于select后面紧跟(char op)参数列表,所以select是一个函数且此函数有一个形参op
*由于select前面带有*号,所以返回值是一个指针,那么指针指向的是什么???
*把已知的函数名和对应的参数去掉变成int (*)(int,int),此时变成一个函数指针,
*所以select的返回值是一个函数指针,指向的是一个带有两个int型形参且返回值是整形的函数
*/
int (*select(char op))(int,int)
{
switch(op)
{
case '+':
return add;
case '-':
return sub;
default:
return NULL;
}
}
int main()
{
int num1,num2;
char op;
//定义一个函数指针用来接受select返回的函数地址(add或者sub)
int (*pFun)(int,int);
printf("请输入一个式子(如4+5):");
scanf("%d%c%d",&num1,&op,&num2);
//通过输入的运算数op,决定调用add还是sub
pFun = select(op);
printf("%d %c %d = %d \n",num1,op,num2,calc(pFun,num1,num2));
return 0;
}
代码运行结果如下:
//通过输入的运算数op,决定调用add还是sub
pFun = select(op);
printf("%d %c %d = %d \n",num1,op,num2,calc(pFun,num1,num2));
return 0;
}
代码运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/42d7e1ca4fa74697ba85d4b9581ffb5b.png#pic_center)