Con trỏ hàm và ứng dụng trong C/C++?

Con trỏ hàm là gì?

Như các bạn đã biết, con trỏ lưu địa chỉ của biến. Tương tự, con trỏ hàm lưu địa chỉ của hàm.

Ứng dụng con trỏ hàm

Thay thế cho lệnh switch case

Xét ví dụ viết các hàm thực hiện phép toán cộng, trừ, nhân, chia. Tại mỗi thời điểm người dùng sẽ chọn 1 trong số các phép toán để thực hiện tính toán.

#include <stdio.h>
#include <conio.h>
#include <assert.h>

float Plus(float a, float b); 
float Minus(float a, float b);
float Multiply(float a, float b);
float Divide(float a, float b);
void Switch(float a, float b, char opCode);

void main()
{
    Switch(4, 5.6, '+');
    Switch(4, 6, '-');
    Switch(4, 0, '/');
    getch();
}

void Switch(float a, float b, char opCode)
{
    float result;

    // execute operation
    switch(opCode)
    {
    case '+' : 
        result = Plus(a, b); 
        break;
    case '-' : 
        result = Minus(a, b); 
        break;
    case '*' : 
        result = Multiply(a, b); 
        break;
    case '/' : 
        result = Divide(a, b); 
        break;
    }
    printf("%f %c %f = %f\n", a, opCode, b, result);
}

float Plus(float a, float b) 
{ 
    return a+b; 
}

float Minus(float a, float b) 
{ 
    return a-b; 
}

float Multiply(float a, float b) 
{ 
    return a*b; 
}

float Divide(float a, float b) 
{ 
    assert(b != 0); 
    return a/b;
}

Giải thích: Hàm assert() đánh giá biến ‘b’ nếu b = 0, exception message xuất hiện.

Kết quả: 

Phép toán cộng, trừ, nhân, chia
Phép toán cộng, trừ, nhân, chia

Để thực thay  thế việc dùng lệnh switch case, chúng ta có thể sử dụng con trỏ hàm để giải quyết bài toán này.

#include <stdio.h>
#include <conio.h>
#include <assert.h>

float Plus(float a, float b); 
float Minus(float a, float b);
float Multiply(float a, float b);
float Divide(float a, float b);
void Switch(float a, float b, float (*p2Func)(float, float));

void main()
{
    Switch(4, 5.6, &Plus);
    Switch(4, 6, &Minus);
    Switch(4, 0, &Divide);
    getch();
}

void Switch(float a, float b, float (*p2Func)(float, float))
{
    float result = p2Func(a, b);
    printf("result = %f\n", result);
}

float Plus(float a, float b) 
{ 
    return a+b; 
}

float Minus(float a, float b) 
{ 
    return a-b; 
}

float Multiply(float a, float b) 
{ 
    return a*b; 
}

float Divide(float a, float b) 
{ 
    assert(b != 0); 
    return a/b;
}

Giải thích:

Hàm Switch() đã được modify bằng cách thay tham số cuối bằng con trỏ hàm. Và đối số truyền vào là địa chỉ hàm: &Plus, &Minus,…

Chú ý:

  • Mỗi con trỏ hàm được khai báo với tham số (số lượng + kiểu dữ liệu) và giá trị trả về
  • Khi bạn muốn sử dụng 1 con trỏ hàm trỏ tới nhiều hàm (như ví dụ trên), thì tham số (số lượng + kiểu dữ liệu) và giá trị trả về của con trỏ hàm và các hàm được trỏ tới phải giống nhau.

Kết quả:

Phép toán cộng, trừ, nhân, chia
Phép toán cộng, trừ, nhân, chia

1 Comment on Con trỏ hàm và ứng dụng trong C/C++?

Leave a Reply