函数指针
我门直接通过一个简单的例子来讲解函数指针
函数指针最常用到的地方就是多肽
多态:一种接口(API函数),多种形态
#include<stdio.h>
int add(int a,int b) //定义 + - * / 四个函数
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int div(int a,int b)
{
return a/b;
}
int mut(int a,int b)
{
return a*b;
}
int main()
{
char opr;
int a=100;
int b=50;
int (*pfun)(int ,int)=add; //定义了一个函数指针,pfun指向+函数,结果返回a+b
printf("%d\n",pfun(a,b));
return 0;
}
在上述代码中,我们把可以将静态多态改成动态多态
将int (*pfun)(int ,int)=add 改成 int (*pfun)(int,int)
这样我们的pfun指向就不确定了,然后再动态调用;如:
int main()
{
char opr;
int a=100;
int b=50;
scanf("%c",&opr);
int (*pfun)(int,int); //动态多肽
if(opr=='+')
pfun=add;
else if(opr=='-')
pfun=sub;
else if(opr=='/')
pfun=div;
else if(opr=='*')
pfun=mut;
printf("%d\n",pfun(a,b));
return 0;
}
让用户手动输入+ - * / 然后输出结果
在上述例子中,我们可以再定义一个calc函数来调用±*/
int calc(int (*pfun)(int,int),int a,int b) //形参列表,第一个为函数指针
{
return pfun(a,b);
}
然后通过调用calc来实现 + - * /
这里再讲一个小知识点:强制转换
如果我再定义一个pfun1来指向calc改怎么写呢?
int (*pfun1)(int (*)(int,int),int,int)=calc;
然后我们来试试将0来赋给pfun1,改如何强转呢?
//pfun1是个函数指针,存放的是函数地址
pfun1=(int (*)(int (*)(int,int),int,int))0; //强转完成
强转诀窍,去掉变量名,其余保持不变。
二级指针
指向指针的指针,存放一级指针的地址
//定义普通变量
/* int a=100;
//一级指针的定义,存放普通变量的地址
int *pa=&a;
//二级指针的定义,存放一级指针的地址
int **ppa=&pa;
printf("sizeof(ppa)=%d\n",sizeof(ppa)); //二级指针也是四个字节
printf("%x %x %x %x\n",pa,ppa,&pa,&ppa); //查看二级指针的地址与其存放的地址
printf("%d %d %d\n",a,*pa,**ppa); //打印a的值的三种方法
*/
上述通过打印一些数据,我们可以知道二级指针也是占4byte空间,其性质与一级指针相同,也是存放地址,只是二级指针存放的是一级指针的地址,也可以通过二级指针应用其内容的内容**ppa引用到一直指针指向的数据。
以一个简单的例子来讲解二级指针
#include<stdio.h>
void fun(int **ppa,int **ppb) //用二级指针来接收传入的以及地址形参
{
int *ppc=*ppa; //交换pa与pb所指向的内容
*ppa=*ppb;
*ppb=ppc;
}
int main()
{
int a=100; //定义变量与其一级指针
int b=200;
int *pa=&a;
int *pb=&b;
printf("%d %d\n",*pa,*pb); //调用函数前指针pa指向a,pb指向b
fun(&pa,&pb); //调用函数,传入pa与pb的地址
printf("%d %d\n",*pa,*pb); //调用函数后指针pa指向b,pb指向a
return 0;
}