函数指针入门

函数指针即为指向一个函数的指针。
要定义一个函数指针,只需将需要指向的函数的原型中函数名的前面加一个"*"号即可。
比如,函数foo的原型为:

int foo(int, char, struct node);

那么要建立一个指向foo的指针,名为bar,就可以这样写:

int (*bar)(int, char, struct node);

要令bar指向foo函数,可以这样写:

bar = foo;

也可以这样写:

bar = &foo;

要使用bar来调用foo函数,可以这样写:

(*bar)(1, ‘a‘, NULL);

其中,函数指针名前的"*"号并不是必须的。
所以,也可以这样写:

bar(1, ‘a‘, NULL);

可是,如果每次定义函数指针时都要输入完整函数原型的话,那就太麻烦了。
我们可以用typedef来定义一个函数指针类型,比如这样:

typedef int (*func)(int, char, struct node);

可以看到,这个语句和foo函数的原型大同小异,只不过名字变了下。接下来,我们就可以用它来定义一个函数指针:

func baz;

是不是方便了很多?我们可以用同样的方法来调用它:

(*baz)(233, ‘c‘, NULL);
baz(233, ‘d‘, NULL);

我们看两张截图,加深理解:



最后说一句,不要尝试去对函数指针进行加减乘除操作,否则你就等着段错误提示吧。

时间: 2024-08-25 23:15:23

函数指针入门的相关文章

回调函数的应用误区1(原汁原味的函数指针应用)

研究了一段时间回调函数,越看越迷惑,分析并改进了从网上看到的几篇好文,看过后有了自己的看法.我也不知道这些跌跌撞撞的认识是否符合回调的真实原理,若有大侠能帮解惑,自当感激不尽. 下面的代码可以在Vs2008下编译并运行: 个人观点: 虽说代码里面到处都注解说这里是回调函数声明,那里是回调函数实现:这里是被调函数声明,那里是被调函数实现:但.....其实个人更感觉这代码更像是一篇函数指针的应用. 跟回调函数没有太大关系,说有关系那也只是格式上的关系. 个人总结: 这篇文章可以让你学会函数指针的使用

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

恼人的函数指针(一)

原文链接:http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html 这篇是为了加深记忆所写.发现,很多知识若不经过反复的琢磨和动手实践,是很难记得住的. 1)  函数指针的初始化. 函数如下: int CompareString(const string& str1, const string& str2) { return str1.compare(str2); } 函数的初始化有两种方式: 第一种,也是最普遍的方式:

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

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

深入浅出剖析C语言函数指针与回调函数(二)

上一篇博文的地址: http://blog.csdn.net/morixinguan/article/details/65494239 这节,我们来看看函数指针与回调函数在Linux内核中的应用. 从上节我们了解到,函数指针和回调函数在开发者和用户之间的一个例子,那么这节,我将引用Linux内核中文件操作结构体来详细的说明. 我们首先来看到这个结构体,这段代码位于linux内核的include/linux/fs.h中,由于代码众多,我只截取几个最基本的例子: File_operations文件操

C语言函数、函数指针解析

函数.函数指针的理解: 函数的定义: void myfunc(void) { } 函数的声明 void myfunc(void); 函数指针的定义.初始化.赋值: 定义:void (*funcp)(void); 初始化: void (*funcp)(void) = &myfunc; 赋值 void (*funcp)(void); funcp = &myfunc; 函数调用:(*funcp)(); funcp(); 也可以这样赋值:void (*funcp)(void); funcp = m

6.7 函数指针

函数指针重载:参数类型要匹配,指针类型必须精确匹配 使用decltype作用于某个函数时,要显示加上*以表示我们需要返回指针,而非函数本身 int func(int a, int b); using pFunc1 = decltype(func) *;typedef decltype(func) *pFunc2;using pFunc3 = int (*)(int a, int b);using pFunc4 = int(int a, int b);typedef int(*pFunc5)(in

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________