一、相关概念
函数指针和指针函数是两个不同的概念。
函数指针是指可以指向函数的指针,它的类型与函数的返回值类型和参数类型相对应。通过函数指针,可以实现函数的回调和动态调用等功。
指针函数则是指返回指针类型的函数,它的返回值是一个指针,可以用来指向一个地址或数据。指针函数通常用于动态分配内存和返回动态生成的数据结构等场景。
需要注意的是,函数指针和指针函数都跟指针有关系,但它们本质上是不同的概念。
总结:
函数指针:本质是指针,指向的是一个函数。形式如下:
void (*pFun)(void);
int (*pFun)(int i,int k);
指针函数:本质是函数,返回值是一个指针。形式如下:
int* pFun(int i,int k);
二、绝对地址如何转换为函数指针
以上一篇文章<单片机如何分散加载文件>为例,方法如下:
int (*pFun)(int,int);//定义指针函数
pFun = (int(*)(int,int))(0x08080001);//my_add_fun 的地址
pFun(num1,num2);
测试代码,如下:
int my_add_test(int num1,int num2)
{
int sum;
my_add_init();
rt_kprintf("my_add_init=0x%08x\r\n",my_add_init);
void (*pFun1)(void);
pFun1 = (void(*)(void))(0x0808001d);//my_add_init 的地址
pFun1();
sum=my_add_fun(num1,num2);
rt_kprintf("my_add_fun=0x%08x\r\n",my_add_fun);
int (*pFun)(int,int);
pFun = (int(*)(int,int))(0x08080001);//my_add_fun 的地址
pFun(num1,num2);
return sum;
}
或者
typedef void (*pVoidFun)(void);
typedef int (*pIntFun)(int num1,int num2);
int my_add_test(int num1,int num2)
{
int sum;
my_add_init();
rt_kprintf("my_add_init=0x%08x\r\n",my_add_init);
void (*pFun1)(void);
//pFun1 = (void(*)(void))(0x0808001d);//my_add_init de di zhi
pFun1=(pVoidFun)(0x0808001d);
pFun1();
sum=my_add_fun(num1,num2);
rt_kprintf("my_add_fun=0x%08x\r\n",my_add_fun);
int (*pFun)(int,int);
//pFun = (int(*)(int,int))(0x08080001);//my_add_fun de di zhi
pFun=(pIntFun)(0x08080001);
pFun(num1,num2);
return sum;
}
实际测试
如何知道函数的地址呢?
①是通过打印,获取函数的绝对地址;
②通过map文件获取函数地址
不知道大家发现了没?地址应该是0x08080000和0x0808001c,怎么变成了0x08080001和0x0808001d。
具体的可以参考:
https://bbs.21ic.com/icview-134389-999-1.html
读PC指针时,返回LSB总是为0;写PC指针时,一定要保证LSB为奇数。
欢迎关注公众号:嵌入式学习与实践