Con trỏ hàm trong C++ | Laptrinhcanban.com

Con trỏ hàm trong C++

Cùng tìm hiểu về con trỏ hàm trong C++. Bạn sẽ biết con trỏ hàm là gì, cách khởi tạo, khai báo, gán địa chỉ của mảng cho con trỏ, cũng như cách gọi một hàm bằng con trỏ trong C++ sau bài học này.

Con trỏ hàm là gì

Trong bài Con trỏ trong C++ là gì chúng ta đã biết, con trỏ trong C++ là một biến được dùng để lưu trữ địa chỉ của dữ liệu trong bộ nhớ máy tính.

Sau khi khai báo thì hàm cũng được lưu trữ tại một địa chỉ trong bộ nhớ, và do đó, chúng ta cũng có thể sử dụng con trỏ để lưu trữ địa chỉ và qua đó thao tác với chúng. Chúng ta gọi con trỏ lưu trữ địa chỉ của một hàm là con trỏ hàm trong C++, và sử dụng nó để truy cập vào địa chỉ của hàm, cũng như thực thi các xử lý bên trong hàm đó.

Phân biệt con trỏ hàm và hàm con trỏ trong C++

Khi học về con trỏ hàm, có 2 khái niệm hay khiến chúng ta nhầm lẫn đó chính là con trỏ hàmhàm con trỏ. Đây là hai khái niệm chỉ 2 loại đối tượng khác nhau và chúng ta cần phân biệt chúng như sau:

  1. Con trỏ hàm là con trỏ được tạo ra để lưu trữ địa chỉ của một hàm trong bộ nhớ máy tính. Ví dụ con trỏ p lưu địa chỉ của hàm A() chẳng hạn. Chúng ta sử dụng con trỏ hàm để truy cập vào vị trí của hàm trong bộ nhớ, cũng như thực thi các lệnh của hàm.
  1. Hàm con trỏ là một hàm thông thường sử dụng các con trỏ làm đối số. Do con trỏ được dùng để lưu giữ địa chỉ của các dữ liệu trong chương trình, ví dụ như con trỏ biến, con trỏ hàm, hoặc con trỏ cấu trúc chẳng hạn, nên thay vì truyền trực tiếp các dữ liệu này vào hàm thì chúng ta cũng có thể truyền con trỏ của chúng vào hàm, qua đó gián tiếp xử lý bên ngoài hàm thông qua con trỏ.
    Ví dụ như chúng ta truyền các con trỏ p1, p2p3 vào hàm B() chẳng hạn.

Để hiểu thêm về cách sử dụng hàm con trỏ, hãy tham khảo bài viết sau đây:

Khai báo con trỏ hàm trong C++

Để khai báo con trỏ hàm trong C++, chúng ta sử dụng cú pháp sau đây:

type (*fp) ( para_type_1, para_type_2, para_type_3,...);

Trong đó fp là tên con trỏ hàm, type là kiểu của con trỏ , và các para_type là kiểu của các đối số (parameter) được truyền vào hàm. Lưu ý kiểu type của con trỏ phải giống với kiểu giá trị trả về của hàm mà nó gán địa chỉ.

Lại nữa, trong trường hợp một hàm không truyền đối số vào nó, tất nhiên do không tồn tại đối số nên chúng ta cũng không cần thiết viết các kiểu đối số khi khai báo con trỏ hàm.

Ví dụ cụ thể:

//Khai báo con trỏ hàm kiểu void với các đối số kiểu int
void (*po1)(int, int);

//Khai báo con trỏ hàm kiểu int với các đối số kiểu int
int (*po2)(int)

//Khai báo con trỏ hàm kiểu void của hàm không có đối số
void (*po3)()

Gán địa chỉ của hàm cho con trỏ hàm

Sau khi khai báo con trỏ hàm, chúng ta có thể tiến hành gán địa chỉ của hàm cho nó, qua đó tạo mối quan hệ tham chiếu đến hàm bằng con trỏ hàm trong C++.

Cú pháp để gán địa chỉ của hàm cho con trỏ hàm như sau:

fp = funct;

Trong đó fp là tên con trỏ hàm, và funct là tên hàm (function) cần gán địa chỉ.

Cũng giống như mảng thì chúng ta không cần thêm toán tử & khi gán địa chỉ một hàm vào con trỏ.

Ví dụ cụ thể:

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

int main(){
int (*fp)(int, int); /* Khai báo con trỏ hàm */

fp = add; /* Gán địa chỉ hàm cho con trỏ */
}

Gọi một hàm bằng con trỏ hàm

Sau khi đã khai báo con trỏ hàm, cũng như gán địa chỉ một hàm cho nó, khi đó một mối quan hệ tham chiếu giữa con trỏ hàm và hàm được tạo ra.

Và bằng cách thao tác với con trỏ, chúng ta có thể tiến hành gọi một hàm bằng con trỏ hàm với cú pháp sau đây:

(*fp) ( para_1, para_2, para_3,...);

Trong đó fp là tên con trỏ hàm, và các para là các đối số (parameter) được truyền vào hàm.

Ví dụ, chúng ta khai báo, gán địa chỉ mảng, và gọi một hàm bằng con trỏ hàm như sau:

#include <iostream>
using namespace std;

//Khai báo hàm
int add(int a, int b)
{
return a + b;
}

int main()
{
int m = 2, n = 5, sum;
int (*fp)(int, int); /* Khai báo con trỏ hàm */

fp = add; /* Gán địa chỉ hàm cho con trỏ */
sum = (*fp)(m, n); /* Gọi hàm bằng con trỏ hàm */
cout << "sum = "<< sum;
return 0;
}

Kết quả, hàm được gọi gián tiếp thông qua con trỏ hàm như sau:

sum = 7

Tổng kết

Trên đây Kiyoshi đã hướng dẫn các bạn về cách sử dụng con trỏ hàm trong C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.