搞了这么久C,函数指针对我来说其实还是有点陌生,用到的时候模板都有了,只能说是看得懂.最近遇到一个软重置的问题顺便可以深入的理解一下:
函数指针是指向函数的指针变量
数据类型标志符 (指针变量名)(形参列表);
1. 函数指针调用函数的方法
#include
int max(int x,int y)
{
return(x>y?x:y);
}
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
2. 透过定义函数指针类型来使用函数指针
#include
typedef int (*fun_ptr)(int,int);
int max(int x,int y)
{
return(x>y?x:y);
}
void main()
{
int a, b, c;
fun_ptr ptr = max;
scanf("%d, %d", &a, &b);
c = (*ptr)(a, b);
printf("a=%d,b=%d,max=%d", a, b, c);
}
PS:赋给函数指针的函数应该和函数指针所指的函数原型是一致的.
3. 函数指针指向的地址是可变的,但是不能++,--. 下例函数指针funcp在变,但是FileFunc和EditFunc是死的.
#include
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
void main()
{
void (*funcp)();
funcp=FileFunc;
(*funcp)();
funcp=EditFunc;
(*funcp)();
}
4. 指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
返回类型标识符 *返回名称(形式参数表)
{ 函数体 }
每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。
5. 实现函数回调
void func()
{
/* do something */
}
void caller(void(*ptr)())
{
ptr(); /* 调用ptr指向的函数 */
}
int main()
{
void (*p)();
p = func;
caller(p);
}
6. 利用函数指针实现软重置.
void(*JumpSDRAM)(void);
void soft_reset()
{
JumpSDRAM = (void (*)(void))(SDRAM_BASE_ADDR); //为函数指针赋值
强制转换为函数指针 需要启动的操作系统地址
JumpSDRAM(); //跳转执行.
}
阅读(1872) | 评论(0) | 转发(1) |