QuânSysAd's Blog: function pointer
Hiển thị các bài đăng có nhãn function pointer. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn function pointer. Hiển thị tất cả bài đăng

28 tháng 6 2018

Tác dụng của con trỏ hàm

Con trỏ hàm công dụng có 2 cái chính:
Định danh tham chiếu, hay gọi là Interface kiểu hàm. Các ngôn ngữ bậc cao thì có khái niệm Interface; nhưng trong C/C++ không có? Trong C sẽ sử dụng qua con trỏ hàm, C++ có thể sử dụng qua virtual class (abstract)
Callback. Trong Java hay gọi là Listener, C# tương đương là delegate, trong các ngôn ngữ khác gọi là closure. Con trỏ hàm trong C/C++ sử dụng làm callback khá nhiều.
Áp dụng trong lập trình Windows API, MFC hay lập trình Linux.
Ta xem xét ví dụ sau:

#include 
 // A normal function with an int parameter
 // and void return type
 void fun(int a)
 {
     printf("Value of a is %d\n", a);
 }

 int main()
 {
     // fun_ptr is a pointer to function fun() 
     void (*fun_ptr)(int) = &fun;

     /* The above line is equivalent of following two
        void (*fun_ptr)(int);
        fun_ptr = &fun; 
     */

     // Invoking fun() using fun_ptr
     (*fun_ptr)(10);

     return 0;
 }
Kết quả ta có : Value of a is 10
Ở đây ta đã khai báo và định nghĩa một hàm fun. Sau đó ta tạo một con trỏ, trỏ tới hàm fun bằng:
void (*fun_ptr)(int) = &fun;
Có thể viết lại dòng trên bằng 2 dòng tương đương sau đây:
void (*fun_ptr)(int);
fun_ptr = &fun;
Lúc này ta gọi hàm fun() bằng cách sử dụng fun_ptr như sau:
(*fun_ptr)(10); Lưu ý ở đây ta đã khai báo kiểu của tham số là int nên không cần phải typecast về int trước.