ITPub博客

首页 > > > C/C++函数指针与指针函数(二)

C/C++函数指针与指针函数(二)

作者:dapan 时间:2018-12-21 17:50:55 0 删除 编辑

文章缘由

上次的文章
嵌入式Linux:C/C++函数指针与指针函数
发出来后,有个同学在后面留言


个人觉得说的比较中肯,文章只说了一些肤浅的东西,没有实质性的内容,也没有涉及到项目开发中,所以这次多说一些,希望大家不要觉得啰嗦。


项目实际用到的函数指针


这是我的android项目hal部分的C++代码,这部分代码用到的是函数指针,通过name来调用不同的函数。


知道看别人的代码

我们有时候看别人的代码时候,经常是一面懵逼,比如下面这个
void (p)(); 还有这个 ((void(*) ())0)();

我记得我在以前的文章里面有谈到一个右左原则,从p开始看,往右走直到遇到)再往左走遇到( ,(*p) 我们就可以看出p是一个指针,继续分析往右走,遇到(),说明p指向一个(void)的函数,往左走,知道p指向的函数返回值是void。ok,看下面的例子。

#include "stdio.h"

void Function()
{
    printf("Call    Function!\n");
}

int main()
{
    void(*p)();
    *(int*)&p = (int)Function;
    (*p)();
    getchar();
    return 0;
}

然后继续分析
((void() ())0)();

  • 1、void (*)() 我们上面分析了这个是一个函数指针,只是把p去掉了而已。
  • 2、把上面的void ()()用PN代替,上面的表达式变成((PN)0)();PN后面有一个0,这个是让我们咋舌的地方,然后我们向一下 (char)a;这样的表达式,所以(PN)0就是把0当成一个地址,强制转换为PN类型,用这个钥匙取出这个地址区域的值。
  • 3、把(*(PN)0)()替换成PM,原来的表达式变成PM(),这样大家看起来比较容易了吧,就是正常的函数调用。

给个例子自己去参透一下

#include <stdio.h>
#include <string.h>

char * fun1(char * p)
{
    printf("%s\n", p);
    return p;
}

char * fun2(char * p)
{
    printf("%s\n", p);
    return p;
}

char * fun3(char * p)
{
    printf("%s\n", p);
    return p;
}

int main()
{
    char * (*pf[3])(char * p);
    pf[0] = fun1; // 可以直接用函数名
    pf[1] = &fun2; // 可以用函数名加上取地址符
    pf[2] = &fun3;

    pf[0]("fun1");
    pf[0]("fun2");
    pf[0]("fun3");

    getchar();
    return 0;
}

欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87164