C++における関数ポインタの詳細とコード共有

4010 ワード

関数ポインタ
関数はメモリのコード領域に格納され、同じアドレスがあります.int test(int a)の関数がある場合、そのアドレスは関数の名前であり、配列の名前が配列の開始アドレスであるようにします.
1、関数ポインタの定義方法:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c言語関数ポインタの定義形式:戻りタイプ(*関数ポインタ名)(パラメータタイプ、パラメータタイプ、パラメータタイプ、...);c++関数ポインタの定義形式:戻りタイプ(クラス名:*関数メンバー名)(パラメータタイプ、パラメータタイプ、パラメータタイプ、...);   
例:int(*fp)(int a);//ここでは、ポインタfp(この関数パラメータはintタイプのみであり、関数戻り値はintタイプ)を定義する.クラスメンバー関数ポインタは、通常の関数ポインタとは異なります.前者は.*->演算子で使用しますが、後者は*演算子(「参照解除」dereference、または「アドレス」indirection)で使用できます.
一般的な関数ポインタは、実際には関数体の先頭アドレスを保持しているので、C/C++で最も一般的なデータポインタと区別する「コードポインタ」とも呼ばれます.
クラスメンバー関数ポインタはクラスメンバー関数のメモリ開始アドレスだけでなく、C++の多重継承、虚継承によるクラスインスタンスアドレスの調整問題を解決する必要があるため、クラスメンバー関数ポインタは呼び出し時に必ずクラスインスタンスオブジェクトに転送される.
関数ポインタの例

#include 
#include 
int fun1()
{
  printf("this is fun1 call
"); return 1; } void fun2(int k, char c) { printf("this is fun2 call:%d %c
", k, c); } int main() { int (*pfun1)() = NULL; void (*pfun2)(int, char) = NULL; int a,b; pfun1 = fun1; // a = pfun1(); // ( ) printf("%d
",a); b = (*pfun1)();// printf("%d
",b); pfun2 = &fun2;// ( , ) pfun2(1,'a'); (*pfun2)(2,'b'); return 0; }

関数ポインタは、関数パラメータとして使用されます.

#include 
#include 
void fun(int k, char c)
{
  printf("this is fun2 call:%d %c
", k, c); } void fun1(void (*pfun)(int, char), int a, char c) { pfun(a, c); } int main() { fun1(fun, 1, 'a'); return 0; } // c++

関数ポインタは、関数として値を返します.

// c   
#include 
#include 
void fun(int k, char c)
{
  printf("this is fun2 call:%d %c
", k, c); } //fun1 double, void(*)(int, char) void (*fun1(double d))(int, char) { printf("%f
",d); return fun; } int main() { void (*p)(int, char) = fun1(3.33); p(1, 'a'); return 0; } //c++ #include using namespace std; class test { public: int fun(int a, char c) { cout<

関数ポインタ配列:

#include 
#include 
float add(float a,float b){return a+b;}
float minu(float a,float b){return a-b;}
int main()
{
  //          ,   2
  //    float (*)(float, float)     
  float (*pfunArry[2])(float, float) = {&add, &minu};
  double k = pfunArry[0](3.33,2.22);//   
  printf("%f
", k); k = pfunArry[1](3.33,2.22); printf("%f
", k); return 0; } //c++

typedef簡略化関数ポインタタイプ:

#include 
#include 
float add(float a,float b)
{
  printf("%f
",a+b); return a+b; } float minu(float a,float b) { printf("%f
",a-b); return a-b; } // pfunType float(*)(float, float) typedef float(*pfunType)(float, float); int main() { pfunType p = &add;// p(3.33, 2.22); pfunType parry[2] = {&add, &minu};// parry[1](3.33, 2.22); // :void fun(pfunType p) // :pfunType fun(); return 0; } //c++

まとめ
以上がC++における関数ポインタの詳細とコード例に関するすべての内容であり,皆さんの役に立つことを願っている.兴味のある友达は引き続き当駅を参照することができます:C言语の実现の学生の选択システムのコードの分かち合いなど、どんな问题があってもいつでも伝言することができて、小编はすぐにみんなに返事します.