天天看點

C++函數指針講解

一、為何存在函數指針

  與資料項相似的是函數也有位址,一般情況下對使用者來說沒什麼用,但是對于程式來說,用處比較大,例如:将另一個函數的位址作為一個函數的參數,這樣第一個函數就能找到第二個函數并且運作它。雖然這種方式比起直接調用的方式比更加的笨拙,但是其允許在不同的時間傳遞不同函數的位址,這意味着可以在不同的時間使用不同的函數。

二、函數位址

  函數名就是函數的位址,例如:函數get_sum(),該函數的位址是get_sum而不是get_sum(),get_sum()為函數的傳回值。

三、聲明函數指針

函數指針的聲明:表明指定的函數傳回類型、表明函數的特征标(參數清單)

注意:隻有當一個函數的傳回類型和參數清單和聲明的函數指針的傳回類型和參數清單一緻的時候才可以進行傳遞,編譯器拒絕這種指派。

例如:

int get_sum(int a, int b);
 
int (*ptr)(int, int); // 聲明函數指針ptr
           

四、使用指針來調用函數

// 第一種方式
(*ptr)(4, 5);
// 第二種方式C++可用
ptr(4, 5);
           

五、使用typedef進行簡化

例如:typedef double MY_Double; 則表示MY_Double是double的一個别名,也就是說MY_Double就相當于double。

#include "pch.h"

#include<iostream>
#include<cstdio>
using namespace std;

int get_sum(int a, int b)
{
	return a + b;
}

int get_mul(int a, int b)
{
	return a * b;
}

void show_result(int a, int b, int(*ptr)(int, int))
{
	cout << ptr(a, b) << endl;
	//cout << (*ptr)(a, b) << endl;
}

int main()
{
	// 寫法一
	/*typedef int (*ptr)(int, int);
	ptr p1 = get_sum;
	cout << p1(4, 5) << endl;
	p1 = get_mul;
	cout << p1(4, 5) << endl;*/

	// 寫法二
	/*int(*ptr)(int, int);
	ptr = get_sum;
	cout << ptr(4, 5) << endl;
	ptr = get_mul;
	cout << ptr(4, 5) << endl;*/
	
	// 寫法三
	show_result(4, 5, get_sum);
	show_result(4, 5, get_mul);

	return 0;
}
           
C++函數指針講解

繼續閱讀