Chinaunix首页 | 论坛 | 博客
  • 博客访问: 187052
  • 博文数量: 38
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 424
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-19 12:41
文章分类

全部博文(38)

文章存档

2017年(2)

2016年(1)

2010年(8)

2009年(27)

我的朋友

分类: C/C++

2010-02-23 17:48:00

搞了这么久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(); //跳转执行.
}
 
阅读(1831) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~