zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4159487.html
Copyright © 2011-2022 走看看