【c和指針學習筆記】函數指針的初始化以及函數調用的三種方式

看如下代碼,然後思考如下幾個問題:

<span style="font-family:KaiTi_GB2312;font-size:18px;">#include<iostream>
#include<cstdlib>
using namespace std;

int func()
{
	cout << "my name is zyh_helen" << endl;
	return 0;
}

int main()
{
	int(*p)() = func;   //函數指針初始化方式1
	int(*p1)() = &func; //函數指針初始化方式2

	func();//函數調用方式1
	(*p)();//函數調用方式2
	p();   //函數調用方式3

	system("pause");
	return 0;
}</span>

問題1:初始化函數指針時,爲何既可以在函數名之前加&操作符,又可以不加?

問題2:函數調用方式有幾種,他們之間的區別是什麼?

問題3:函數指針的用途有哪些?



1:函數指針初始化方式有兩種:

方式2中的&操作符是可選因爲函數名被使用時總是由編譯器把它轉化爲函數指針,&操作符只是顯示的說明了編譯器將隱式執行的任務

2:函數調用方式有三種:

函數調用方式1:使用函數名調用函數,執行過程可能和你想象的不一樣,函數名首先被轉化爲一個函數指針,該指針指定函數在內存中的位置,然後,函數調用操作符()調用該函數,執行開始於這個地址的代碼。
函數調用方式2:首先對p執行間接訪問操作,它把函數指針轉化爲一個函數名,這個轉換並不是真正需要的,因爲編譯器在執行函數調用操作符之前又會把它轉換回去
函數調用方式3:省去了編譯器的隱式轉化
因此,通過函數指針調用函數時,最好選擇方式3

3:函數指針的用途:

1:回調函數:用戶把一個函數指針作爲參數傳遞給其他函數,後者將“回調”用戶的函數
2:轉移表  :本質:一個函數指針數組



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章