我們知道指針是用來指向一些變量的;類似地,函數指針是用於指向函數的指針。它本質上用於存儲函數的地址。我們可以通過使用函數指針來調用函數,也可以將指針作為參數傳遞給另一個函數。
它們主要用於 event-driven 應用程序、回調,甚至用於將函數存儲在數組中。
函數的地址是什麽?
計算機隻理解低級語言,即二進製形式。我們用 C++ 編寫的程序總是用高級語言編寫的,所以為了將程序轉換成二進製形式,我們使用編譯器。編譯器是將源代碼轉換為可執行文件的程序。此可執行文件存儲在 RAM 中。 CPU 從 main() 方法開始執行,它讀取 RAM 中的副本而不是原始文件。
所有的函數和機器碼指令都是數據。這個數據是一堆字節,所有這些字節在 RAM 中都有一些地址。函數指針包含函數第一條指令的 RAM 地址。
聲明的語法
以下是函數指針聲明的語法:
int (*FuncPtr) (int,int);
上麵的語法是函數聲明。由於函數並不像變量那樣簡單,但 C++ 是類型安全的,因此函數指針具有返回類型和參數列表。在上麵的語法中,我們首先提供返回類型,然後是指針的名稱,即 FuncPtr,它被方括號包圍,前麵是指針符號,即 (*)。在此之後,我們提供了參數列表 (int,int)。上麵的函數指針可以指向任何接受兩個整數參數並返回整數類型值的函數。
函數地址
我們可以很容易地得到一個函數的地址。我們隻需要提到函數的名字,我們不需要調用函數。
讓我們通過一個例子來說明。
#include <iostream>
using namespace std;
int main()
{
std::cout << "Address of a main() function is:" <<&main<< std::endl;
return 0;
}
在上麵的程序中,我們顯示的是一個 main() 函數的地址。要打印一個 main() 函數的地址,我們剛剛提到了函數的名稱,沒有括號沒有參數。因此,不帶任何括號或參數的函數名本身表示函數的地址。
我們可以使用另一種方式來打印函數的地址,即 &main;。
間接調用函數
我們可以在函數指針的幫助下通過簡單地使用函數指針的名稱來調用函數。通過函數指針調用函數的語法與我們正常調用函數的語法類似。
讓我們通過一個例子來理解這個場景。
#include <iostream>
using namespace std;
int add(int a , int b)
{
return a+b;
}
int main()
{
int (*funcptr)(int,int); // function pointer declaration
funcptr=add; // funcptr is pointing to the add function
int sum=funcptr(5,5);
std::cout << "value of sum is:" <<sum<< std::endl;
return 0;
}
在上麵的程序中,我們聲明了函數指針,即int(*funcptr)(int,int),然後我們將add()函數的地址存儲在funcptr中。這意味著 funcptr 包含 add() 函數的地址。現在,我們可以使用funcptr 調用add() 函數。語句funcptr(5,5)調用add()函數,add()函數的結果存儲在sum變量中。
輸出:
讓我們看另一個函數指針的例子。
#include <iostream>
using namespace std;
void printname(char *name)
{
std::cout << "Name is:" <<name<< std::endl;
}
int main()
{
char s[20]; // array declaration
void (*ptr)(char*); // function pointer declaration
ptr=printname; // storing the address of printname in ptr.
std::cout << "Enter the name of the person:" << std::endl;
cin>>s;
cout<<s;
ptr(s); // calling printname() function
return 0;
}
在上麵的程序中,我們定義了函數 printname(),它包含字符指針作為參數。我們聲明函數指針,即 void (*ptr)(char*)。語句 ptr=printname 表示我們將 printname() 函數的地址分配給 ptr。現在,我們可以使用語句 ptr(s) 調用 printname() 函數。
輸出:
將函數指針作為參數傳遞
函數指針可以作為參數傳遞給另一個函數。
讓我們通過一個例子來理解。
#include <iostream>
using namespace std;
void func1()
{
cout<<"func1 is called";
}
void func2(void (*funcptr)())
{
funcptr();
}
int main()
{
func2(func1);
return 0;
}
上麵代碼中,func2()函數以函數指針作為參數。 main() 方法調用func2() 函數,其中傳遞func1() 的地址。這樣,func2() 函數就間接調用了 func1()。
輸出:
相關用法
- C++ Function Overloading用法及代碼示例
- C++ 函數用法及代碼示例
- C++ unordered_map cbegin用法及代碼示例
- C++ map lower_bound()用法及代碼示例
- C++ list assign()用法及代碼示例
- C++ std::max()用法及代碼示例
- C++ std::string::push_back()用法及代碼示例
- C++ multimap key_comp()用法及代碼示例
- C++ Deque erase()用法及代碼示例
- C++ std::less_equal用法及代碼示例
- C++ set rbegin()用法及代碼示例
- C++ llround()用法及代碼示例
- C++ getline(string)用法及代碼示例
- C++ boost::algorithm::all_of()用法及代碼示例
- C++ string::length()用法及代碼示例
- C++ log2()用法及代碼示例
- C++ lrint() and llrint()用法及代碼示例
- C++ bitset all()用法及代碼示例
- C++ set upper_bound()用法及代碼示例
- C++ CHAR_MIN用法及代碼示例
注:本文由純淨天空篩選整理自 Function Pointer in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。