`
yuanlanjun
  • 浏览: 1210854 次
文章分类
社区版块
存档分类
最新评论

浅谈函数指针

 
阅读更多

函数指针的概念,在潭浩强先生的C语言程序设计这本经典的教程中提及过,在大多数情况下我们使用不到,也忽略了它的存在。函数名实际上也是一种指针,指向函数的入口地址,但它又不同于普通的如int*、double*指针,看下面的例子来理解函数指针的概念:

第一行代码首先定义了一个函数function,其输入为两个整型数,返回也为一个整型数(输入参数和返回值可为其它任何数据类型);后面又定义了一个函数指针fun,与int*或double*定义指针不同的是,函数指针的定义必须同时指出输入参数,表明这是一个函数指针,并且*fun也必须用一对括号括起来;并将函数指针赋值为函数function,前提条件是*fun和function的输入参数和返回值必须保持一致,否则无法通过编译。可以直接调用函数function(),也可以直接调用函数指针,二者是等效的。

声明函数指针

回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子:

void f(); // 函数原型

上面的语句声明了一个函数,没有输入参数并返回void。那么函数指针的声明方法如下:

void (*) ();

函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢?

如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。

定义一个指向函数的指针用如下的形式,以上面的test()为例:

int (*fp)(int a); //这里就定义了一个指向函数的指针

函数指针绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。

int *fp(int a); //这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注意!

例如函数原型为:

int fun(int *, int);

则函数指针可以声明为: int (*pf)(int *, int);
当然从上述例子看不出函数指针的优点,目的主要是想引出函数指针数组的概念。我们从上面例子可以得知,既然函数名可以通过函数指针加以保存,那们也一定能定义一个数组保存若干个函数名,这就是函数指针数组。正确使用函数指针数组的前提条件是,这若干个需要通过函数指针数组保存的函数必须有相同的输入、输出值。

如果赋了不同的值给函数指针,那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。

下面我们来看一个具体的例子:

typedef定义可以简化函数指针的定义,在定义一个的时候感觉不出来,但定义多了就知道方便了,上面的代码改写成如下的形式:




分享到:
评论

相关推荐

    浅谈c语言指针结构.pdf

    浅谈 C 语言指针结构 本文主要探讨 C 语言中的指针结构,讨论了一维指针、二维指针、指针数组与数组指针的概念和应用。指针是 C 语言中广泛使用的一种数据类型,函数是构成 C 语言程序的基本单位,在 C 语言中,将...

    浅谈C语言指针的理解

    ### 浅谈C语言指针的理解 #### 一、引言 C语言作为一种广泛应用的编程语言,其灵活性和效率使其成为系统级编程、嵌入式系统开发等领域的首选语言之一。而在C语言中,指针是一种非常强大的特性,能够极大地提高程序...

    浅谈在Swift中关于函数指针的实现

    在Swift编程语言中,函数指针的概念与C语言中的函数指针有所不同。由于Swift的安全性和类型安全性,直接获取函数的指针并不像在C语言中那样简单。然而,Swift提供了另一种方式来实现类似的功能,这涉及到函数类型的...

    浅谈C语言指针的应用.pdf

    "浅谈C语言指针的应用" 本文主要探讨C语言指针的应用,特别是多维数组和指针之间的关系。指针是C语言中一个重要的概念,也是C语言的一个重要特色。正确而灵活地运用指针,可以有效地表示复杂的数据结构;能够动态...

    浅谈C语言中函数形参为指针类型的参数传递.pdf

    C语言中函数形参为指针类型的参数传递详解 在C语言编程中,函数形参是函数定义中声明的变量,用于接收函数调用时传递的参数。在函数形参中,指针类型的参数传递是一种常见的参数传递方式。指针类型的参数传递可以将...

    浅谈c语言指针的相关注意问题

    通过使用`sizeof()`函数可以获取指针的大小,这有助于了解指针在内存中的实际占用情况。 ### 指针自身占用的内存空间 指针自身也需要占用一定的内存空间。在大多数32位系统中,无论指针指向何种类型的数据,它们...

    浅谈Delphi的指针

    ### 浅谈 Delphi 中的指针 #### 一、引言 在计算机编程领域,指针是一个极其重要的概念,它允许程序员直接控制内存,从而提高程序的性能和灵活性。通常,C语言因其强大的指针功能而备受推崇,但实际上,Delphi ...

    浅谈C语言中指针的概念及基本应用规律.pdf

    指针的基本概念包括数组指针和指针数组、指针函数和函数指针。 数组指针是指向数组的指针,它的作用是能够访问数组中的元素。由于数组元素在内存中是连续存储的,数组指针可以利用这一点进行高效的遍历访问。而指针...

    浅谈Object Pascal的指针

    Object Pascal也支持函数指针,但它的语法有所不同,通常涉及到`Procedure`或`Function`类型,并使用`@`符号来获取函数的地址。 总的来说,Object Pascal的指针机制虽然与C语言有所不同,但同样强大且灵活,能够...

    浅谈C语言函数.pdf

    6. 函数的间接访问:如果要通过函数修改主调函数中的变量,通常需要使用指针参数,这样函数内部通过指针可以间接访问并修改变量的值。这在传址调用中经常出现,但需要程序员明确使用指针。 7. C语言库函数:C语言...

    C语言中的指针浅谈.pdf

    - 函数指针保存了一个函数的入口地址,可以用于回调函数或实现函数指针数组等。 - 结构体指针用于指向一个结构体变量,允许通过指针来访问结构体的成员。 指针的运算主要有以下几个方面: - 地址运算符(&)用来...

    浅谈C++中强制类型转换函数

    在实际应用中,强制类型转换函数可以用于解决许多问题,例如将基本数据类型转换为其他类型、将基类指针转换为子类指针、将void指针转换为目标类型的指针等。但是,需要注意的是,强制类型转换函数可能会带来一些风险...

    浅谈C语言的指针.pdf

    在深入探讨C语言的指针之前,我们首先要了解指针在C语言中的重要性和它所代表的概念。C语言是一种通用的编程语言,它融合了汇编语言的硬件操作能力和高级语言的抽象功能,使得C语言能够被广泛用于编写操作系统和应用...

    浅谈C语言中指针变量的定义与应用.pdf

    5. 函数参数的传递:通过指针可以将变量的地址传递给函数,从而在函数内部修改外部变量的值。这种操作称为“传址调用”。 总结来说,指针是C语言中一种强大的工具,它让程序员能够通过间接寻址的方式操作内存,提高...

    应用笔记LAT1241+浅谈STM32库里的回调函数

    1. **函数指针的使用**:回调函数最典型的实现方式是通过函数指针。函数指针是指向函数的一种特殊类型的指针,它可以保存函数的地址,并在需要时通过该指针调用对应的函数。例如,在上述示例代码中,`Compute`函数...

    c++指针和引用的使用浅谈

    在面向对象编程中,引用常用于构造对象间的关联关系,如成员函数的this指针,以及标准模板库(STL)中的迭代器。而指针则在动态内存管理、多态和模板元编程等方面发挥重要作用。 总结起来,C++中的指针和引用都是...

    浅谈C语言中指针的教学.pdf

    C语言中的指针是其强大特性和灵活性的关键所在,它允许程序员直接操作内存,实现高效的数据处理和函数调用。然而,对于初学者而言,指针的概念和使用往往是学习过程中的难点。本文将深入探讨指针的教学方法以及相关...

    浅谈C语言中指针的理解及应用.pdf

    学习指针时,通常建议从简单的指针声明、赋值、访问等操作开始,逐步过渡到指针的高级应用,如指针与数组的结合、指针与函数的结合、指针的指针(二级指针)以及指针与动态内存分配等。 总之,指针在C语言中扮演着...

    浅谈《C语言程序设计》中指针的应用.pdf

    标题所指的《浅谈《C语言程序设计》中指针的应用》是一篇探讨C语言中指针使用方法和技巧的文章。在C语言的编程领域中,指针的概念对于初学者和专业开发者都是一项基础且极其重要的内容。文章通过探讨指针的概念、...

    浅谈sizeof与strlen函数的区别.pdf

    《浅谈sizeof与strlen函数的区别》 在C语言中,`sizeof`和`strlen`都是用来获取内存占用信息的重要工具,但它们的应用场景和计算方式却有着显著的区别。本文将详细解析这两个操作符的特性。 首先,`sizeof`是C语言...

Global site tag (gtag.js) - Google Analytics