1. 程式人生 > 實用技巧 >函式指標與指標函式

函式指標與指標函式

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

用法不同

指標函式直接呼叫,並將返回的地址賦給預先宣告好的指標變數即可

函式指標:需要事先自定義一個函式,同時宣告一個函式指標,然後將自定義函式地址賦給指標變數,最後通過函式指標變數呼叫