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

    C/C++语言中,通常会使用到函数指针和指针函数,容易让人混淆,下面针对两种概念进行介绍,分别包括定义、本质、使用和两者的不同点。

    指针函数

    定义

    指针函数,简单来说,就是一个返回指针的函数,其本质是一个函数,而该返回值是一个指针。

    声明格式:返回值类型* 函数名(参数表)

    简单函数声明:其返回值是一个int型,

    int func(int a, int b);
    

     指针函数声明:其返回值是一个int*,为一个int类型的指针,是一个地址变量

    int* func(int a, int b);
    

     简单函数声明和指针函数声明唯一的区别在于,指针函数的函数名前面多了个“ * ”,即返回了一个地址而已。

    示例:

    代码使用了对象的构造函数和默认参数等知识。

    #include <iostream>
    using namespace std;

    typedef struct _Data{ int a; int b; int c; _Data(int x = 0, int y = 0, int z = 0):a(x), b(y), c(z){} }DataT;
    //指针函数 DataT* func(int a, int b){ DataT* Data = new DataT(); Data->a = a; Data->b = b; Data->c = a + b; return Data; } int main(int argc, char *argv[]){ int a = 10, b = 20; DataT *myData = func(a, b); cout << a << " + " << b << " = " << myData->c << endl; delete myData; return 0; }

    输出结果为:

    10 + 20 = 30
    

     函数指针

    定义

    函数指针,本质是一个指针变量,该指针指向这个函数。即函数指针就是指向这个函数的指针变量。

    声明格式:返回值类型 (*函数名) (参数列表)

    函数指针声明如下:

    int (*func)(int a, int b);
    

     对函数指针赋值时,有两种写法:

    int func1(int a, int b);//func1函数声明
    func = func1; func = &func1;

     同typedef一起使用时,有两种方法:

    //方法一: 
    typedef  int  (IntFunc)(int  a,int  b); //声明一个函数类型
    IntFunc *myfunc  =  NULL; //定义一个函数指针
    myfunc = func1;//函数指针赋值
    
    //方法二:
    typedef  void  (*IntFuncP)(int  a,int  b)  ; //声明一个函数指针类型
    IntFuncP myfunc  =  NULL//定义一个函数指针
    myfunc = func1;//函数指针赋值
    

     函数指针的调用:

    //方法1
    c = (*func)(a, b);//倾向于,可识别函数指针变量
    
    //方法2
    c = func(a, b);
    

     示例:

    #include <iostream>
    using namespace std;
    
    typedef struct _Data {
    	int a;
    	int b;
    	int c;
    	_Data(int x = 0, int y = 0, int z = 0) :a(x), b(y), c(z) {}
    }DataT;
    
    //自己的函数
    DataT func(int a, int b) {
    	DataT Data;
    	Data.a = a;
    	Data.b = b;
    	Data.c = a + b;
    	return Data;
    }
    
    //声明一个函数指针
    DataT (*myFuncP)(int a, int b);
    
    int main(int argc, char *argv[]) {
    	int a = 10, b = 20;
            myFuncP = func;//函数指针赋值
    	DataT myData = (*myFuncP )(a, b);//函数指针调用
    	cout << a << " + " << b << " = " << myData.c << endl;
    	return 0;
    }
    

     输出结果为:

    10 + 20 = 30
    

     二者区别:

    定义不同

    指针函数本质是一个函数,其返回值为指针;

    函数指针本质是一个指针,其指向一个函数。

    写法不同

    指针函数:int* func(int a, int b);

    函数指针:int (*func)(int a, int b);

    用法不同

    指针函数直接调用,并将返回的地址赋给预先声明好的指针变量即可

    函数指针:需要事先自定义一个函数,同时声明一个函数指针,然后将自定义函数地址赋给指针变量,最后通过函数指针变量调用

  • 相关阅读:
    leetcode 11. 盛最多水的容器
    gluoncv 导入方式
    python import
    leetcode 55.跳跃游戏
    leetcode 31. 下一个排列
    gluoncv 下载预训练模型速度太慢
    gluoncv voc_detection
    shuf 按行打乱文本命令
    __call__
    @property 装饰器
  • 原文地址:https://www.cnblogs.com/jpzhu/p/13692382.html
Copyright © 2011-2022 走看看