函数指针与指针函数

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);

用法不同

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

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

原文地址:https://www.cnblogs.com/jpzhu/p/13692382.html