Pointer To Function

Cách khai báo con trỏ hàm: Giống prototype của hàm cần trỏ tới và thêm dấu * vào đầu tên hàm và thêm dấu ngoặc bao quanh với danh sách tham số giống hàm cần trỏ tới.

Ví dụ có hàm int Sub(int a, int b);   --> int (*PFunc)(int , int);//khai bao con tro ham

Ví dụ:

#include <iostream>
using namespace std;

int Add(int a, int b);
int Sub(int a, int b);
int (*PFunc)(int , int);//khai bao con tro ham
int CallFuction(int a, int b, int (*pFunc)(int, int));//truyen tham so bang con tro ham
                            
void main()
{
     int a  = 10, b = 20;
    
     PFunc = Add;
     cout << PFunc(a, b) << endl;

     PFunc = Sub;
     cout << PFunc(a, b) << endl;
    
     cout << CallFuction(a, b, Add) << endl;
     cout << CallFuction(a, b, Sub) << endl;
     system("pause");
}

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

int Sub(int a, int b)
{
     return (a - b);
}

int CallFuction(int a, int b, int (*pFunc)(int, int))
{
     return (*pFunc)(a, b);
}


Ví dụ: con trỏ hàm trong sắp xếp mảng


/*
Nhap n so phan tu cua mang kieu int.
Viet ham random gia tri < n cho mang tren.
Viet 2 ham sap xep mang tang dan và giam dan.
Viet ham với tham so truyen vao la kiểu con trỏ hàm để gọi
1 trong 2 hàm sắp xếp trên.
*/
#include <iostream>

using namespace std;

int *NhapMang(int n);             //prototype
void InMang(int *parr, int n);    //prototype
void SapXepTangDan(int *a, int n);    //prototype
void SapXepGiamDan(int *a, int n);    //prototype
void HoanDoi(int &x, int &y);
void CallFunction(int *arr, int n, void(*Func)(int *, int));

void main()
{
     int n;//Nhap so phan tu mang
     cout << "Nhap n = ";
     cin >> n;
     int *A;
     A = NhapMang(n);
     InMang(A, n);
    
     CallFunction(A, n, SapXepTangDan);//SapXepTangDan(A, n);
     cout << "Sau khi sap xep tang dan:" << endl;
     InMang(A, n);

     CallFunction(A, n, SapXepGiamDan);//SapXepGiamDan(A, n);
     cout << "Sau khi sap xep giam dan:" << endl;
     InMang(A, n);
    

     system("pause");
}

int *NhapMang(int n)
{
     int *pArr = 0;
     pArr = new int[n];
     for (int i = 0; i < n; i++)
     {
          pArr[i] = rand() % n;
     }
     return pArr;
}

void InMang(int *parr, int n)
{
     for(int i = 0; i < n; i++)
     {
          cout << parr[i] << ", ";
     }
     cout << endl;
}

void SapXepTangDan(int *a, int n)
{
     for(int i = 0; i < n - 1; i++)
     {
          for(int j = i + 1; j < n; j++)
          {
              if(a[i] > a[j])
              {
                   HoanDoi(a[i], a[j]);
              }
          }
     }
}


void SapXepGiamDan(int *a, int n)
{
     for(int i = 0; i < n - 1; i++)
     {
          for(int j = i + 1; j < n; j++)
          {
              if(a[i] < a[j])
              {
                   HoanDoi(a[i], a[j]);
              }
          }
     }
}

void HoanDoi(int &x, int &y)
{
     x = x ^ y;
     y = x ^ y;
     x = x ^ y;
}

void CallFunction(int *arr, int n, void(*Func)(int *, int))
{
     (*Func)(arr, n);
}