2 qq 23903863 qq_23903863 于 2016.09.08 19:58 提问

c语言中函数指针的问题

1 #include
2
3 void test()
4 {
5 printf("test successful\n");
6 }
7
8
9 void main()
10 {
11 unsigned int a;
12 a = (unsigned int)test;
13 void (*isr)(void);
14 isr = (void(*)(void))&a;
15 printf("isr:%p\n&a:%p\na:%d\ntest:%d\n", isr, &a, a, test);
16 test();
17 (*isr)();
18 }

2个回答

liuhhaiffeng
liuhhaiffeng   2016.09.08 21:59

这一句有问题: isr = (void(*)(void))&a;, 应该为: isr = (void(*)(void))a;

是 a, 不是 &a, 看清楚了吗?
另外 (*isr)() 与 isr() 的调用是等价的, 具体原因, 你可以上网查询:"函数名与函数指针"的区别.

另外, 良好的代码风格是错误少发生, 错误容易找出的必要保障,

 #include <stdio.h>

void test()
{
    printf("test successful\n");
}


void main()
{
    // 没有必要写两行, 定义的时候直接初始化
    // 写成两行, 第一行是"默认初始化", 第二行是"赋值"
    // unsigned int a;
    // a = (unsigned int)test;
    unsigned int a = (unsigned int)test;

    // 定义函数指针
    //void (*isr)(void);
    typedef void(* PFUNC_T)(void);

    //isr = (void(*)(void))&a;
    PFUNC_T isr = (PFUNC_T)a;


    printf("isr:%p\n &a:%p\n a:%d\n test:%d\n", isr, &a, a, (unsigned int)test);

    test();

    // (*isr)() 与 isr() 调用等价, 推荐后者写法
    // (*isr)();
    isr();
}


 #include <stdio.h>

void test()
{
    printf("test successful\n");
}


void main()
{
    // 没有必要写两行, 定义的时候直接初始化
    // 写成两行, 第一行是"默认初始化", 第二行是"赋值"
    // unsigned int a;
    // a = (unsigned int)test;
    unsigned int func_addr = (unsigned int)test;

    // 定义函数指针
    //void (*isr)(void);
    typedef void(* PFUNC_T)(void);

    //isr = (void(*)(void))&a;
    PFUNC_T func_ptr = (PFUNC_T)func_addr;


    printf("func_ptr:%p\n &func_addr:%p\n func_addr:%d\n test:%d\n", func_ptr, &func_addr, func_addr, (unsigned int)test);

    test();

    // (*isr)() 与 isr() 调用等价, 推荐后者写法
    // (*isr)();
    isr();
}

hijack00
hijack00   Rxr 2016.09.09 08:59

typedef void(*isr_t) (void);
isr_t isr = test;
isr();

Csdn user default icon
上传中...
上传图片
插入图片