函数指针

3 篇文章 0 订阅
  1. (*(void(*)())0)();

    void(*)()           // 这就是一个没有名字的函数指针
    *(void(*)())0       // 这里可以看成 *(xx)0 的形式,其中 () 是类型转换符
                        // 所以这里的执行顺序应该是 *( (void(*)())0 )
                        // 所以这里是将数字 0 转换为函数的指针类型
                        // 及这个没有名字的函数指针指向一个地址为 0 的函数
    (*(void(*)())0)();  // 调用这个首地址为 0 的函数。
                        // 综上:可以理解为在地址为0的内存放了一个没有返回值,没有参数的函数,
                        //      这个语句就是调用这个函数。

    其实直接写((void(*)())0)(); 也可以正确执行;

    #include <stdio.h>
    ​
    void fun(void) 
    {
        printf("HelloWorld!\n");
    }
    ​
    int main(void) 
    {
        (*(void(*)())&fun)();       // 这里用fun函数的地址代替 0 地址
        ((void(*)())fun)();         // 结果完全正确!!
        return 0;
    }
  2. (*(char**(*)(char**,char**))0)(char**,char**);

    同理,这个可以理解为内存为 0 的地址放了一个返回值为 char** ,有两个参数 (char**, char**) 的函数,而这个语句就是调用这个函数。理论上语句前还应该有一个 char** 的变量接收这个返回值的。

  3. #include <stdio.h>
    ​
    #if 1                               // 1 编译正确,  0 编译出错 
    typedef void (*pFunTyp) (void);     // 这里定义了一个类型,而不是一个变量
    pFunTyp pFun;                       // 所以这里必须再通过类型定义一个变量 
    #else
    typedef void (*pFun) (void);        // 这里是直接定义了一个函数指针变量 
    #endif  
    ​
    void fun(void) 
    {
        printf("HelloWorld!\n");
    }
    ​
    int main(int argc, char *argv[]) 
    {   
        pFun = fun;         // 这里的两种赋值方式都可以
    //  pFun = &fun;
        pFun();             // 以及这两种调用方式也能正确执行
        (*pFun)();
        return 0;
    }
  4.  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值