概念:函数名实际代表函数的开始地址,它可以直接送给一个指针变量,不过送地址方式比较特殊,例如:
int add(int a,int b);
int(*p)(int a,int b);
p=add;//将函数add地址送给指针p
如果想使用类型定义的话,需要如下这么做:
typedef int(* pstr)(int,int)//定义指针变量pstr为函数指针
int add(int a,int b);
pstr p;//定义p为指向返回值为int,输入参数为两个int的函数指针
p=add;//建立指针变量和add函数的绑定关系。
基础知识介绍完,来一个有点难度的测试函数如下:
建立5个函数,返回值为int,输入参数为两个int,函数名字分别为:add\sub\mul\chu\yu。同时定义指针类型pstr,可以指向同类型函数,再建立函数指针数组,分别存放五个函数的入口地址,然后调用for循环,分别回调这五个函数。运行结果参照下面:
重点语句:
pstr * p1=arr;
arr是函数指针数组的首地址,也是第一个元素占用的首地址,这个地址开始的8个字节存的函数add的地址,因为pstr类型的变量直接指向一个函数指针,存放函数指针的地址当然是要在这个基础上再加一重指针,所以p的变量类型为 pstr *。
(*(p1+i))(50,30)指针进行解引用时,保证解引用字符*和被解引用的对象放在一起,所以(*(p1+i))可以直接得出arr数组中的元素,也就是函数入口地址。
最后发出个感慨:学好c指针,C语言平推。学好C语言,就向嵌入式迈进一大步。