• C函数指针的用法


    1.最简单的用法:

     1 #include <cstdio>
     2 
     3 int (*p)(int);//定义一个函数指针变量p(下面的f其实是一个常量函数指针)
     4 int f(int x)
     5 {
     6     printf("%d
    ",x+2);
     7     return 0;
     8 }
     9 
    10 int main()
    11 {
    12     p=f;
    13     p(2);//等价于f(2)
    14     return 0;
    15 }
    View Code

    还有另一种对应写法,不过实在不喜欢,可以忽略。简单来说,就是f()与(*f)()实现相同的功能,p指针也不例外。我不是很明白为什么c语言允许这样写,干脆就不记这种写法了。

    2.第二种用法:

     1 #include <cstdio>
     2 
     3 typedef int (*p)(int);//定义一个函数指针类型
     4 int f(int x)
     5 {
     6     printf("%d
    ",x+2);
     7     return 0;
     8 }
     9 
    10 int main()
    11 {
    12     p pp;//定义函数指针变量
    13     pp=f;
    14     pp(2);//等价于f(2)
    15     return 0;
    16 }
    View Code

    函数指针类型和普通数据类型类似,恐怕你会想到把它作为函数参数来用吧,嗯,试试很简单的。

    3.地址跳转:

    void(*reset)(void)= (void(*)(void))0。

      void(*reset)(void)就是函数指针定义,(void(*)(void))0是强制类型转换操作,将数值“0”强制转换为函数指针地址“0”。

      通过调用reset()函数,程序就会跳转到程序执行的“0”地址处重新执行。在一些其他高级单片机Bootloader中,如NBoot、UBoot、EBoot,经常通过这些Bootloader进行下载程序,然后通过函数指针跳转到要执行程序的地址处。

    1 ) void (*theUboot)(void);

        。。。。
        theUboot = (void (*)(void))(0x30700000);
        theUboot();
        。。。。。

    2 )  (*(void (*)(void))(0x30700000))();

    强制类型转换,将一个绝对地址转换为一个函数指针,并调用这个函数以跳转到前面提到的绝对地址.
    翻译成汇编就是:
    mov r0,0x30700000;
    mov pc,r0

    对于(*(void (*)(void))(0x30700000))();
    可以这样理解

    首先(void( * )(void) )是一个强制类型转换符,他将后面的0x30700000这个无符号整数强制转化为一个函数指针,该函数指针所指向的函数入口参数为 void,返回值也是void 。 如果到这步你看懂了,那么设(void (*)(void))(0x30700000)为 fp; 那么上面的表达式就可以简化为 fp()。

    参考:http://blog.chinaunix.net/uid-25572546-id-2939029.html

  • 相关阅读:
    java使用jsp servlet来防止csrf 攻击的实现方法
    Fiddler抓包6-get请求(url详解)
    Fiddler抓包5-接口测试(Composer)
    Fiddler抓包4-工具介绍(request和response)
    Fiddler抓包3-查看get与post请求
    Selenium2+python自动化60-异常后截图(screenshot)
    Selenium2+python自动化59-数据驱动(ddt)
    Selenium2+python自动化58-读取Excel数据(xlrd)
    Selenium2+python自动化57-捕获异常(NoSuchElementException)
    Selenium2+python自动化56-unittest之断言(assert)
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4159487.html
Copyright © 2020-2023  润新知