Một con trỏ hàm là một biến con trỏ trỏ đến một hàm. Khi một ứng dụng được biên dịch, các chức năng là một phần của ứng dụng cũng được chuyển đổi thành các mã riêng của bộ xử lý / trình biên dịch tương ứng. Khi ứng dụng được tải trong bộ nhớ chính để thực thi, mã tương ứng với chức năng cũng được tải vào bộ nhớ và nó nằm ở địa chỉ bộ nhớ do trình tải ứng dụng cung cấp. Tên
203
hàm ánh xạ tới một địa chỉ có lệnh đầu tiên (mã máy) của hàm. Một con trỏ hàm trỏ đến địa chỉ này.
Hình thức khai báo chung của một con trỏ hàm được đưa ra dưới đây.
return_type (*pointer_name) (argument list)
trong đó, return_type đại diện cho kiểu trả về của hàm, con trỏ tên biểu thị tên của con trỏ và danh sách đối số biểu thị kiểu dữ liệu của các đối số của hàm. Nếu hàm chứa nhiều đối số, các kiểu dữ liệu được phân tách bằng ‘,’. Khai báo điển hình của con trỏ hàm được đưa ra dưới đây
//Function pointer to a function returning int and takes no parameter int (*fptr)();
//Function pointer to a function returning int and takes 1 parameter int (*fptr)(int)
Các dấu ngoặc đơn () xung quanh biến con trỏ hàm phân biệt nó như một biến con trỏ hàm.
Nếu không có dấu ngoặc đơn được sử dụng, khai báo sẽ trông như int *fptr();
Trình biên dịch chéo diễn giải nó như là một khai báo hàm cho hàm có tên ‘fptr’ có danh sách đối số là void và giá trị trả về là một con trỏ tới một số nguyên. Bây giờ chúng ta đã khai báo một con trỏ hàm, bước tiếp theo là ‘Làm thế nào để gán một hàm cho một con trỏ hàm?’. Chúng ta hãy giả sử rằng có một chức năng với chữ ký
int function1(void);
và một con trỏ hàm với khai báo int (*fptr)();
Chúng ta có thể gán địa chỉ của hàm function1 () cho biến con trỏ hàm fptr với câu lệnh gán sau:
fptr = &function1;
Toán tử ‘&’ lấy địa chỉ của hàm ‘function1’ và nó được gán cho biến con trỏ ‘fptr’ với toán tử gán ‘=’. Địa chỉ của toán tử & là tùy chọn khi tên của hàm được sử dụng. Do đó, hoạt động chuyển nhượng có thể được viết lại như sau:
fptr = function1;
Khi địa chỉ của loại chức năng đúng được gán cho con trỏ hàm, hàm có thể được gọi bởi bất kỳ một trong các phương thức sau.
204 (*fptr)();
fptr();
Con trỏ hàm cũng có thể được khai báo bằng typedef. Khai báo và sử dụng một con trỏ hàm với typedef được minh họa bên dưới.
//Function pointer to a function returning int and takes no parameter typedef int (*funcptr)();
funcptr fptr;
Mã mẫu sau đây minh họa khai báo, định nghĩa và sử dụng con trỏ hàm.
#include<stdio.h>
void square(int x);
void main() {
//Declare a function pointer void (*fptr)(int);
//Define the function pointer to function square fptr = square;
//Style 1: Invoke the function through function pointer fptr(2);
//Style 2: Invoke the function through function pointer (*fptr)(2);
}
//###################################################################
//Function for printing the square of a number void square(int x) {
printf(“Square of %d = %d\n”, x, x*x);
}
Con trỏ hàm là một tính năng hữu ích trong liên kết muộn. Đoạn mã mẫu sau đây minh họa việc sử dụng con trỏ hàm làm tham số cho hàm.
205 #include <stdio.h>
//###################################################################
//Function prototype declaration void square(int x);
void cube(int x);
void power(void (*fptr)(int), int x);
void main() {
//Declare a function pointer void (*fptr)(int);
//Defi ne the function pointer to function square fptr = square;
//Invoke the function ‘square’ through function pointer power (fptr,2);
//Defi ne the function pointer to function cube fptr = cube;
//Invoke the function ‘cube’ through function pointer power (fptr,2); }
//###################################################################
//Interface function for invoking functions through function pointer void power(void (*fptr)(int), int x) {
fptr(x); }
//###################################################################
//Function for printing the square of a number void square(int x) {
printf(“Square of %d = %d\n”, x, x*x);
206 }
//###################################################################
//Function for printing the third power (cube) of a number void cube(int x) {
printf(“Cube of %d = %d\n”, x, x*x*x);
}
Mảng của các con trỏ hàm: Một mảng các con trỏ hàm giữ các con trỏ tới các hàm có cùng kiểu. Điều này cung cấp sự linh hoạt để chọn một chức năng bằng cách sử dụng một chỉ mục.
Mảng của con trỏ hàm có thể được xác định bằng cách sử dụng con trỏ hàm trực tiếp hoặc vòng loại typedef.
//Declare an array of pointers to functions, which returns int and //takes no parameters, using direct function pointer declaration int (*fnptrarr[5])();
//Declare and initialise an array of pointers to functions, which //return int and takes no parameters, using direct function pointer- //declaration
int (*fnptrarr[])()= {/*initialisation*/};
//Declare and initialise to ‘NULL’ an array of pointers to functions, // which return int and takes no parameters, using direct function //pointer declaration
int (*fnptrarr[5])()= {NULL};
//Declare an array of pointers to functions, which returns int and //takes no parameters, using typedef function pointer declaration typedef int (*fncptr)(); fncptr fnptrarr[5])();
//Declare and initialise an array of pointers to functions, which //return int and takes no parameters, using typedef function pointer-
//declaration
typedef int (*fncptr)();
207 fncptr fnptrarr[] ()= {/*initialisation*/};
//Declare and initialise to ‘NULL’ an array of pointers to functions, // which return int and takes no parameters, using typedef function
//pointer declaration
typedef int (*fncptr)();
fncptr fnptrarr[5]()= {NULL};
Đoạn mã sau minh họa việc sử dụng mảng con trỏ hàm:
#include<stdio.h>
//###################################################################
//Function prototype defi nition void square(int x);
void cube(int x);
void main() {
//Declare a function pointer array of size 2 and initialise void (*fptr[2])(int)= {NULL};
//Defi ne the function pointer 0 to function square fptr[0] = square;
//Invoke the function square fptr[0](2);
//Define the function pointer 1 to function cube fptr[1] = cube;
//Invoke the function cube through function pointer fptr[1](2); }
//###################################################################
//Function for printing the square of a number
208
void square(int x) { printf(“Square of %d = %d\n”, x, x*x); }
//###################################################################