C函数指针的用法

1.最简单的用法:

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

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

2.第二种用法:

 1 #include <cstdio>
 2
 3 typedef int (*p)(int);//定义一个函数指针类型
 4 int f(int x)
 5 {
 6     printf("%d\n",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 }

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

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

时间: 2024-10-08 02:14:35

C函数指针的用法的相关文章

C中函数指针的用法

理解了C中的声明和指针的话题后再来看函数指针的用法就很容易了. C中函数指针主要有两个用途: 1.作为参数传递给另外一个函数(即作为回调函数) 2.转换表(jump table) 下面分别来介绍作为回调函数的用法和作为转换表的用法 1.回调函数 在链表的查找中使查找函数与类型无关 /*在一个单链表中查找一个指定值的函数.它的参数是一个指向链表第一个节点的指针 * 一个指向我们需要查找的值的指针和一个函数指针,它所指向的函数用于比较存储于链表中的类型的值*/ #include <stdio.h>

函数指针的用法

函数指针试吃由于函数地址的指针.针织能够指向函数对于C/C++来说很重要也很有用,这为我们编译时未确定的顺序呢执行函数提供了另一种选择,而不需要使用条件语句. 1.声明函数指针 void (*foo)(); int (*f1)(double);//传入double,返回int void (*f2)(char*);//传入char*指针,没有返回值 double* (*f3)(int,int);//返回double指针 如果去掉第一对括号就成了返回 void* 的函数了! 下面的例子就是返回指针的

《C++ Primer》学习 之 函数指针相关用法

/* 函数指针相关用法*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 //#define NDEBUG 4 #include <iostream> 5 #include <stdexcept> 6 #include <cassert> 7 #include <ctype.h> 8 #include <locale> 9 #include <iterator> 10 #incl

C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论

今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程中执行.最终目标是,继承的业务逻辑类外部调用时有两个接口可选,调用syncRun同步执行:调用由引擎自动生成的asyncRun就异步执行.最终自动生成asyncRun的模板基类没能实现,主要原因是mingw对this处理的太有问题了!!原本以为编译器问题,后来才知道成员函数指针和this指针如此特殊

C中的函数指针的用法

include<stdio.h> typedef int (*Cal)(int a,int b);//定义一个函数指针,第一个int是指向函数的返回值的类型,后面括号里面的两个int是指指向函数的参数类型 int Add(int a ,int b) { int result=a+b; return result; } int Sub(int a ,int b) { int result=a-b; return result; } int main() { Cal cal1=&Add;/

类内部定义函数指针及其用法

发生如下错误 以为是命名空间与函数指针的问题.查询得到有价值的信息如下: 实际解决问题参考的帖子如下: 最终问题解决了.明天详述. 原文地址:https://www.cnblogs.com/yuweng1689/p/12596304.html

x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)

判断一个32位应用程序是否运行在x64系统下,可以使用下面的代码: [cpp] view plain copy BOOL IsX64System() { BOOL bIsWow64 = FALSE; typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); LPFN_ISWOW64PROCESS pfnIsWow64 = NULL; pfnIsWow64 = (LPFN_ISWOW64PROCESS)GetProcAddress( Ge

函数指针的用法。

#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h> typedef int (*funtcb)(void); int functa(void){printf("%s %d \n",func,LINE);return 0;} int add(int a, int b ){int sum;typeof(sum) t;t = sum = a

C 函数指针的用法

#include <stdio.h>#include <stdlib.h> typedef struct DataNode{ int (*handle)();}tDataNode; int print(){ printf("Hello World!\n"); return 0;} int main(){ int a = 0; tDataNode * pData = NULL; pData= (tDataNode *) malloc (sizeof(tDataNo