- vừa được xem lúc

[C] Function Pointer - Con Trỏ Hàm

0 0 16

Người đăng: Semi Dev

Theo Viblo Asia

Giống với các kiểu con trỏ dữ liệu thông thường như int*, char*, v.v... con trỏ hàm *function được sử dụng để trỏ tới vùng bộ nhớ lưu trữ định nghĩa hàm đã được nạp khi chương trình khởi chạy. Dưới đây là một ví dụ đơn giản về việc khai báo và gọi hàm thông qua một con trỏ hàm.

#include <stdio.h> void showInt (int $n) { printf ("Value of $n is %d", $n);
} void main (int $argc, char* $argv[]) { void (*fp) (int) = & showInt; (*fp) (9);
}

Kết quả:

Value of $n is 9

Ở vị trí khai báo biến con trỏ $fp, chúng ta có thể thấy là việc định nghĩa một kiểu con trỏ hàm thực ra là ghi lại bộ chữ ký signature của hàm mà chúng ta muốn trỏ tới. Sau khi viết lại bộ chữ ký của showInt, việc cần làm là thay thế tên hàm bằng cú pháp khai báo biến con trỏ có dạng * variable_name. Việc sử dụng một cặp ngoặc đơn để nhóm phép thực thi * và tên biến là điều cần thiết, bởi nếu không thì trình biên dịch sẽ nhóm ký hiệu * ở đây với tên định kiểu dữ liệu trả về là void.

Đặc trưng con trỏ hàm

Con trỏ hàm có một số điểm đặc trưng khác với kiểu con trỏ dữ liệu thông thường. Xuất phát từ tên định nghĩa của hàm, thực chất cũng là một dạng con trỏ đặc biệt được sử dụng để trỏ tới điểm xuất phát của định nghĩa hàm đã được nạp khi khởi chạy chương trình. Vì vậy nên chúng ta có thể copy trực tiếp địa chỉ từ tên hàm thay vì sử dụng phép thực thi &, và như vậy ở vị trí gọi hàm thông qua con trỏ cũng có thể lược giản bớt phép truy xuất *.

void main (int $argc, char* $argv[]) { void (*fp) (int) = showInt; fp (9);
}

Định nghĩa con trỏ hàm xuất hiện sau so với các kiểu con trỏ dữ liệu thông thường, nhằm cung cấp thêm khả năng triển khai code Functional trong môi trường C. Sau khi biết cách định nghĩa con trỏ hàm, chúng ta đã có thể sử dụng hàm gọi lại callback, hoặc lưu trữ hàm trong mảng kết hợp.

#include <stdio.h> void add (int a, int b) { printf ("Addition is %d \n", a+b);
} void sub (int a, int b) { printf ("Subtraction is %d \n", a-b);
} void mul (int a, int b) { printf ("Multiplication is %d \n", a*b);
} int main (int $argc, char* $argv[]) { void (*fp[]) (int, int) = { add, sub, mul }; unsigned int n; int a = 1, b = 2; printf ("0 - addition \n"); printf ("1 - subtraction \n"); printf ("2 - multiply \n"); printf ("Enter choice: "); scanf (&n); if (n > 2) return 0; else fp[n] (a, b); return 0;
}

Kết quả:

0 - addition 1 - subtraction 2 - multiply Enter choice: 0
Addition is 3

Thông tin tham khảo

Nhiều tính năng OOP của C++ được triển khai bằng cách sử dụng con trỏ hàm trong C. Ví dụ như khai báo hàm trừu tượng virtual function, hay định nghĩa các phương thức của class - Object-Orietned C

Bình luận

Bài viết tương tự

- vừa được xem lúc

4 đặc tính của lập trình hướng đối tượng (Object oriented program)

Lập trình hướng đối tượng quá quen thuộc rồi bạn nào học lập trình đều phải học, đi phỏng vấn cũng vậy hỏi suốt(chắc cái này tùy vào vị trí tuyển dụng chủ yếu junior chắc chắn sẽ hỏi).nó là nền tảng cho hầu hết các design pattern hiện nay.

0 0 34

- vừa được xem lúc

Khác nhau giữa abstract class và interface khi nào dùng chúng

Nhắc đến Interface và abstract class hãy nhớ 2 từ này khá clear rồi, Khi sử dụng Interface là bạn Implement còn sử dụng abstract class là bạn extend. . Interface:. .

0 0 29

- vừa được xem lúc

Chuyện con vịt, cái máy bay và cu Tèo đọc báo

Chuyện con vịt, cái máy bay và cu Tèo đọc báo. Người đọc tự chịu trách nhiệm về tính xác thực của bài viết.

0 0 53

- vừa được xem lúc

Kinh nghiệm làm việc với Cgo

Kinh nghiệm làm việc với Cgo. Cuối tuần vừa rồi mình có làm một project nho nhỏ để học hỏi thêm, điểm khá thú vị là project này tuy không to lắm nhưng lại chứa khá là nhiều vấn đề và buộc mình phải tì

0 0 35

- vừa được xem lúc

Cách xây dựng cấu trúc dữ liệu Stack và Queue.

Mở đầu. Hello các bạn, hôm nay mình sẽ chia sẻ với các bạn cách để có thể tự xây dựng 2 loại cấu trúc dữ liệu stack(ngăn xếp) và queue(hàng đợi) sử dụng mảng trong C++;.

0 0 31

- vừa được xem lúc

Lập trình socket, giao tiếp client và server bằng ngôn ngữ C (với giao thức TCP)

Lập trình mạng là gì. Lập trình mạng là một trong những nhiệm vụ căn bản để phát triển các ứng dụng.

0 0 150