zoukankan      html  css  js  c++  java
  • 指针函数与函数指针

     

     指针函数与函数指针


      对于没有系统的学习过C++的同学来说,指针仿佛是一个难以逾越的鸿沟,但是其实指针没那么复杂,或者可以这么说,
     我们选择性的忽略指针,比如说就把指针当做一个实例对象
     
     例如 类Person
     有两种实例化方法
     1. Person p; //在栈里分配内存,作用域内有效,自动释放
     2. Person *p = new Person(); //在堆内分配内存,需要手动调用 delete p; 来释放
     
     其实在这里,完全可以抛弃指针的概念,就认为两个都是对象,只是调用成员函数成员变量的方法不同,还有作用域不同就可以了。
     之所以提到这些,就是引出今天要谈的一个概念,那就是指针函数和函数指针的概念,这两个概念,相信很多人都不明白。
     今天我们就简单探讨一下。
     
     1.指针函数
     
     在C语言这种面向过程的语言中,整个程序都是通过函数调用来一步一步实现的,对于函数,相信大家都再熟悉不过了。
     例如:
     
     void func();
     int func();
     float func();
     char func();
     
     char* func();
     int * func();
     float *func();
     
     我们看到前四个函数的返回类型,是标准的系统类型,void ,int ,float,char。这个毫无疑问,后三个则返回值都是指针类型,
     C语言函数的返回类型,可以是指针类型。这就称之为指针函数,概念很简单。再简单地说就是返回一个地址指针。
     
     类型:
     类型名 *函数名(函数参数列表);
     
     
     2.函数指针
     
     函数指针是本文介绍的重点,什么是函数指针,说白了就是一个指向函数的指针。首先它是一个指针,它指向的是一个函数的入口地址,
     函数的入口地址在哪里呢,函数就是内存中的一片区域,函数有一个入口地址,函数指针就是指向的这个入口地址。
     
     
     例如:
     
     void func();
     void func(int a);
     void func(int a,char b);
     
     函数指针的作用是什么呢,有两方面,一个是为了调用函数提供另一种途径,二是可以把函数当做一个变量来传递,起到回调的作用。
     个人认为后一点很重要,在实际的编码中用到很多,可节省不少工作量。
     
     上述三个函数,我们可以写成如下形式:
     
     void (*Func1)();
     void (*Func2)(int a);
     void (*Func3)(int a,char b);
     

     这样在调用的时候就可以用如下方法:
     
     (*Func1)();
     (*Func2)(1);
     (*Func3)(1,'a');
     
     下面进行下一步操作,我们把它们声明成一种类型:
     
     typedef void (*Func1)();
     typedef void (*Func2)(int a);
     typedef void (*Func3)(int a,char b);
     
     这是就可以定义 Func1,Func2,Func3类型的变量了,我们就可以把函数当做参数传递了。



    下面附上代码

    //
    //  main.cpp
    //  Test
    //
    //  Created by 王猛 on 13-11-15.
    //  Copyright (c) 2013年 wangmeng. All rights reserved.
    //
    
    #include <iostream>
    
    typedef void (*Func1)();
    typedef void (*Func2)(int a);
    typedef void (*Func3)(int a,char b);
    
    
    void func1()
    {
        printf("%s  call
    ",__FUNCTION__);
    }
    
    void func2(int a)
    {
        printf("%s  call a=%d
    ",__FUNCTION__,a);
    }
    
    void func3(int a,char b)
    {
        printf("%s  call a=%d,b=%c
    ",__FUNCTION__,a,b);
    }
    
    
    void callBack1(Func1 f)
    {
        (*f)();
    }
    
    void callBack2(Func2 f, int a)
    {
        (*f)(a);
    }
    
    void callBack3(Func3 f, int a, char b)
    {
        (*f)(a,b);
    }
    
    int main(int argc, const char * argv[])
    {
    
        callBack1(func1);
        callBack2(func2, 1);
        callBack3(func3, 1, 'b');
        
        func1();
        func2(1);
        func3(1, 'b');
    
        
        return 0;
    }
    


    输出结果是:


  • 相关阅读:
    Redis在Windows上使用和集群配置
    Lzma(7-zip)和zlib
    Windump教程-参数介绍
    Windows 使用windump进行循环抓包
    wireshark长时间抓包分多个文件
    发现TCP的一种错误----客户端连接失败(10055错误号)
    MySQL [Err] 1055
    解决socket交互的10048和10055错误的总结
    Socket调用Close后如何终止套接口的问题
    linux下recv 、send阻塞、非阻塞区别和用法
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3503336.html
Copyright © 2011-2022 走看看