`
fireDragonpzy
  • 浏览: 466469 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C/C++中函数指针的含义

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

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

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

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

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

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

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

#include <iostream>  
#include <string>  
using namespace std;  
  
int test(int a);  
  
void main(int argc,char* argv[])    
{  
    cout<<test<<endl;//显示函数地址  
    int (*fp)(int a);  
    fp=test;//将函数test的地址赋给函数学指针fp  
    cout<<fp(5)<<"|"<<(*fp)(10)<<endl;  
//上面的输出fp(5),这是标准c++的写法,(*fp)(10)这是兼容c语言的标准写法,两种同意,但注意区分,避免写的程序产生移植性问题!  
    cin.get();  
}  
  
int test(int a)  
{  
    return a;  
}

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

#include <iostream>  
#include <string>  
using namespace std;  
  
int test(int a);  
  
void main(int argc,char* argv[])    
{  
    cout<<test<<endl;  
    typedef int (*fp)(int a);//注意,这里不是生命函数指针,而是定义一个函数指针的类型,这个类型是自己定义的,类型名为fp  
    fp fpi;//这里利用自己定义的类型名fp定义了一个fpi的函数指针!  
    fpi=test;  
    cout<<fpi(5)<<"|"<<(*fpi)(10)<<endl;  
    cin.get();  
}  
  
int test(int a)  
{  
    return a;  
}

 函数指针同样是可以作为参数传递给函数的,下面我们看个例子,仔细阅读你将会发现它的用处,稍加推理可以很方便我们进行一些复杂的编程工作。

//-------------------该例以上一个例子作为基础稍加了修改-----------------------------  
#include <iostream>    
#include <string>    
using namespace std;    
    
int test(int);    
  
int test2(int (*ra)(int),int);  
  
void main(int argc,char* argv[])      
{    
    cout<<test<<endl;  
    typedef int (*fp)(int);    
    fp fpi;  
    fpi=test;//fpi赋予test 函数的内存地址  
  
    cout<<test2(fpi,1)<<endl;//这里调用test2函数的时候,这里把fpi所存储的函数地址(test的函数地址)传递了给test2的第一个形参  
    cin.get();  
}    
    
int test(int a)  
{    
    return a-1;  
}  
  
int test2(int (*ra)(int),int b)//这里定义了一个名字为ra的函数指针  
{  
    int c=ra(10)+b;//在调用之后,ra已经指向fpi所指向的函数地址即test函数  
    return c;  
}

  利用函数指针,我们可以构成指针数组,更明确点的说法是构成指向函数的指针数组,这么说可能就容易理解的多了。

#include <iostream>    
#include <string>    
using namespace std;  
  
void t1(){cout<<"test1";}  
void t2(){cout<<"test2";}  
void t3(){cout<<"test3";}  
void main(int argc,char* argv[])      
{  
    void* a[]={t1,t2,t3};  
    cout<<"比较t1()的内存地址和数组a[0]所存储的地址是否一致"<<t1<<"|"<<a[0]<<endl;  
  
    cout<<a[0]();//错误!指针数组是不能利用数组下标操作调用函数的  
  
    typedef void (*fp)();//自定义一个函数指针类型  
    fp b[]={t1,t2,t3}; //利用自定义类型fp把b[]定义趁一个指向函数的指针数组  
    b[0]();//现在利用指向函数的指针数组进行下标操作就可以进行函数的间接调用了;  
    cin.get();  
}

  仔细看上面的例子可能不用我多说大家也会知道是怎么一会事情了,最后我们做一个重点小结,只要记住这一点,对于理解利用函数指针构成数组进行函数间接调用就很容易了!

void* a[]={t1,t2,t3}; 
cout<<"比较t1()的内存地址和数组a[0]所存储的地址是否一致"<<t1<<"|"<<a[0]<<endl; 

cout<<a[0]();//错误!指针数组是不能利用数组下标操作调用函数的

  上面的这一小段中的错误行,为什么不能这么调用呢? 

  前一篇教程我们已经说的很清楚了,不过在这里我们还是复习一下概念,指针数组元素所保存的只是一个内存地址,既然只是个内存地址就不可能进行a[0]()这样地址带括号的操作,而函数指针不同它是一个例外,函数指针只所以这么叫它就是因为它是指向函数指向内存的代码区的指针,它被系统授予允许与()括号操作的权利,进行间接的函数调用,既然函数指针允许这么操作,那么被定义成函数指针的数组就一定是可以一样的操作的。


摘自:http://pcedu.pconline.com.cn/empolder/gj/c/0503/566020_all.html#content_page_1
分享到:
评论

相关推荐

    C/C++ 函数指针的意义,函数指针的用法

    在C/C++编程中,函数指针是一种高级特性,它允许程序员处理函数的方式如同处理变量一般灵活。理解函数指针的意义及其用法,对于提升代码的可扩展性和灵活性至关重要。 #### 1. 函数指针的基本概念 在C/C++中,函数...

    有关C/C++的函数指针概念课件仅供学习使用

    在学习C/C++编程语言的过程中,函数指针是高级编程技巧之一,它允许将函数作为参数传递给其他函数,或者在运行时动态决定调用哪个函数。函数指针本身是指向函数入口地址的指针,每个函数都有一个入口地址,这个地址...

    C/C++中文函数手册

    《C/C++中文函数手册》是一份非常实用的编程资源,专为C和C++开发者设计,提供了详尽的函数库信息和速查指南。这份手册涵盖了C语言库函数和C++ API,对于初学者和有经验的程序员来说都是一个宝贵的参考资料。 C语言...

    C++中函数指针的含义

    在C++中,函数指针是一个非常重要的概念,它允许我们直接操作函数的地址,从而实现函数的动态调用和传递。理解函数指针对于深入掌握C++编程至关重要。 首先,函数在内存中占据一定的位置,就像数据一样,它们也有...

    C/C++ 函数指针教程

    ### C/C++函数指针教程 #### 一、函数指针简介 函数指针是C/C++编程语言中一个非常强大的特性,它允许程序将函数作为参数传递或从函数返回,从而实现高度灵活的编程模式。函数指针可以极大地提高代码的可重用性和...

    c/c++中的指针的应用及注意问题

    在C/C++编程中,指针是一个至关重要的概念,它允许程序员直接操作内存地址,实现高效的数据处理和复杂的算法。本文将深入探讨指针的应用以及需要注意的问题,帮助你更好地理解和运用指针。 首先,我们需要回顾一下...

    C/C++指针学习 指针经验学习

    总的来说,本资料集将深入探讨这些主题,帮助读者从基础到高级全面理解C/C++中的指针,掌握指针操作、动态内存管理、指针与数组、成员指针以及指针在函数中的应用等关键知识,从而提升编程技能。通过详尽的实例和...

    C/C++中多维数组指针作为函数参数传递程序

    C/C++中多维数组指针作为函数参数传递程序 在 C++ 中,多维数组指针作为函数参数传递是非常常见的编程技术。本文将详细介绍如何在 C/C++ 中将多维数组指针作为函数参数传递,並对相关知识点进行详细解释。 多维...

    C/c++ 语言 函数库 参考手册

    CLib.chm文件很可能是C/C++函数库的综合指南,包含了详细的函数描述、参数列表、返回值、示例代码和可能的错误信息。CHM文件通常配备搜索功能,使得开发者可以快速定位到需要的信息。 使用《C/C++ 语言函数库参考...

    C/C++指针经典资料大全

    在IT领域,C和C++语言中的指针是至关重要的概念,它们是程序设计的基础,也是许多高级技术的基石。本资源包“C/C++指针经典资料大全”收集了多部经典教材,旨在帮助学习者深入理解并掌握指针的使用。 1. **指针基础...

    C/C++语言中指针的四要素

    C/C++中的指针是编程语言的一个核心概念,它允许程序直接访问内存。指针具有几个关键要素,这四个要素共同定义了指针的行为和用途。首先是指针的类型,它决定了指针的大小和如何解释指针所指向的内存。指针类型由...

    关于C++中函数指针的使用(包含对typedef的分析).txt

    ### 关于C++中函数指针的使用(包含对typedef的分析) #### 一、函数指针基础 在C++中,函数也是一种可以被指针指向的数据类型,这就是所谓的“函数指针”。函数指针是一种特殊的指针类型,它允许程序员通过指针来...

    C/C++全部函数查询

    学习C/C++函数,不仅需要理解其功能,还要注意其使用的上下文,比如内存管理(栈与堆的区别,何时使用`new`和`delete`),类型转换(隐式与显式,const的使用),以及预处理器(宏定义,条件编译等)。 此外,理解...

    c/c++标准函数库查询中文版

    C/C++标准函数库是编程领域中的重要组成部分,它提供了大量的预定义函数,用于执行各种任务,如输入/输出操作、内存管理、字符串处理、数学运算等。这个“C/C++标准函数库查询中文版”显然是为了帮助程序员更便捷地...

    用汇编的眼光看C/C++之深入指针

    除了指向数据的指针外,C/C++还支持**函数指针**,即指向函数的地址的指针。这允许程序员以动态的方式调用函数,提高了程序的灵活性。 ##### 示例分析 以下是一个使用函数指针的示例: ```c void add() { printf...

    C/C++指针的用法总结实例工程

    在这个名为"C/C++指针的用法总结实例工程"的项目中,我们将深入探讨五种关键的指针相关概念,包括双重指针、引用、指针函数、指针数组以及数组指针,并通过实际的例子来帮助理解这些概念。 首先,让我们看看双重...

    c/c++帮助文档中文

    C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域。这份"c/c++帮助文档中文"提供了丰富的中文资源,帮助开发者深入理解和掌握这两种语言。 C语言是最早由Dennis Ritchie在贝尔实验...

    深入理解C语言指针的奥秘 C和C++中函数指针的含义(上).pdf

    总结来说,函数指针是C和C++语言中非常重要的概念,它为程序提供了强大的功能和灵活性。通过合理地使用函数指针,程序员可以编写出结构清晰、易于维护和扩展的代码,并且可以充分利用语言提供的底层能力来实现高级的...

    C/C++ API 帮助文档大全(中文,chm格式)

    6. **C库的C++封装**:C++对C库中的函数进行了封装,如头文件和分别对应C语言的和,使得C++代码能以更现代的方式来使用这些函数。 7. **C++11及后续版本的新特性**:从C++11开始,C++引入了一系列新特性,如lambda...

    林锐-高质量c/c++编程指南

    - **C++函数高级特性**:介绍了C++中特有的高级功能,如函数重载、运算符重载等,帮助开发者更好地利用语言特性。 - **类的构造函数、析构函数与赋值函数**:详细说明了这些特殊成员函数的作用和实现方法,对于理解...

Global site tag (gtag.js) - Google Analytics