函数指针与指针函数
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);
用法不同
指针函数直接调用,并将返回的地址赋给预先声明好的指针变量即可
函数指针:需要事先自定义一个函数,同时声明一个函数指针,然后将自定义函数地址赋给指针变量,最后通过函数指针变量调用