Function Pointers (Con trỏ hàm)

Một phần của tài liệu Bài giảng Xây dựng các hệ thống nhúng: Phần 2 (Trang 64 - 70)

3. The OS must be fast

3.5.12Function Pointers (Con trỏ hàm)

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. (adsbygoogle = window.adsbygoogle || []).push({});

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) {

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

207

fncptr fnptrarr[] ()= {/*initialisation*/}; (adsbygoogle = window.adsbygoogle || []).push({});

//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); }

//################################################################### //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ột phần của tài liệu Bài giảng Xây dựng các hệ thống nhúng: Phần 2 (Trang 64 - 70)