30/09/2018, 21:32

Hỏi về con trỏ HÀM trong C

Mọi người cho em hỏi. con trỏ hàm trong C được sử dụng như thế nào. múc đích của nó là gì. và gọi nó trong hàm main thì làm thế nào??

Ngô Doãn Tuấn viết 23:34 ngày 30/09/2018

sử dụng như thế nào

Với những biến có sử dụng con trỏ hàm thì sau khi ra khỏi hàm các giá trị của biến đó cũng sẽ thay đổi !

Trong hàm main, gọi tới hàm đó, trước biến có sử dụng con trỏ hàm ta truyền thêm & trước biến.


ví dụ

void test( int *n){

   *n = *n +10;
}
int main(){
      int a = 15;
      test(&a);
      printf("%d",a);
}
Biên Nhút viết 23:40 ngày 30/09/2018

không phải mình hỏi về tham chiếu đâu.
cái con trỏ hàm là nó sẽ có dạng
VD int *daynhauhoc(int n)

Ngô Doãn Tuấn viết 23:39 ngày 30/09/2018

Cái đó là hàm con trỏ
Bạn có thể thao khảo bài viết rất rất chi tiết sau
http://diendan.congdongcviet.com/threads/t42977::tim-hieu-ban-chat-cua-con-tro-tu-co-ban-den-nang-cao.cpp

Tao Không Ngu. viết 23:42 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Tao Không Ngu. viết 23:40 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Biên Nhút viết 23:45 ngày 30/09/2018

vì kiến thức về IT còn ít nên Bác trả lời làm e bối rồi quá.

viết 23:48 ngày 30/09/2018

http://diendan.congdongcviet.com/threads/t25204::con-tro-ham-trong-c-cpp-function-pointer.cpp
có thể đây là cái bạn cần

Sơn viết 23:36 ngày 30/09/2018

Mình có 1 VD như này:
Giả sử bạn muốn viết 1 hàm tìm những người có những đặc điewẻm riêng từ danh sahs này:

char *ADS[] = {
 "William: SBM GSOH likes sports, TV, dining",
 "Matt: SWM NS likes art, movies, theater",
 "Luis: SLM ND likes books, theater, art",
 "Mike: DWM DS likes trucks, sports and bieber",
 "Peter: SAM likes chess, working out and art",
 "Josh: SJM likes sports, movies and theater",
 "Jed: DBM likes theater, books and dining"
};

Bạn viết 1 hàm tìm những người có đặc điểm là thích thể thao, đọc sách:

void find()
{
       int i;
       puts("Ket qua:");
       puts("------------------------------------");
       for (i = 0; i<7 ; i++) {
            if (strstr (ADS[i] , "sport")&&strstr (ADS[i] ,"books" )) {
                   printf("%s\n", ADS[i]);
            }
       }
}

Rồi xong, nhưng bây giờ bạn lại muốn viết 1 hàm khác tìm những người thích đi xem phim và xem TV,… thì bạn sẽ copy code hàm trên, đổi tên và thay thế diều kiện. Nhưng mỗi hàm gần như giống nhau về công việc của nó: lặp qua các phần tử, kiểm tra điều kiện và xuất ra màn hình nếu đúng với điều kiện, chỉ khác nhau có mỗi 1 dòng điều kiện, sẽ có rất nhiều code bị lặp lại. Để tiết kiệm thời gian, tránh code bị lặp lại, ta sử dụng con trỏ hàm

Giả sử có 1 hàm kiểm tra diều kiện cần tìm kiếm:

int sports_and_books(char *s)
{
 return strstr(s, "sports") && strstr(s, "books");
}

ta có thể khai báo con trỏ hàm của hàm trên như sau:
ở hàm main():

int(*books_sport_fp)(char *);
books_sport_fp=sports_and_books;

phải thay đổi tham số ở hàm find

void find(int(*tim_kiem)(char *))
{
       int i;
       puts("Ket qua:");
       puts("------------------------------------");
       for (i = 0; i<7 ; i++) {
            if (tim_kiem(ADS[i])) {
                   printf("%s\n", ADS[i]);
            }
       }
}

sau đó gọi nó ở hàm find()
ở hàm main():

find(sports_books);

Mỗi khi gọi hàm find thì nó sẽ duyệt qua các phần tử trong mảng, kiểm tra điều kiện thông qua cách gọi hàm kiểm tra điều kiện bằng con trỏ của hàm đó mà ta đã truyền vào hàm find().

Vậy là xong, bây giờ bạn có muốn tìm kiếm những người phù hợp đi chăng nữa chỉ cần viết hàm kiểm tra điều kiện, tạo con trỏ hàm trỏ tới nó và truyền vào hàm find là xong, code ngắn hơn, sáng sủa hơn.

Cách tạo con trỏ ham trỏ tới 1 hàm:
[Kiểu trả về](*[tên con trỏ])([tham số truyền vào hàm])

Thông qua con trỏ hàm, ta có thể gọi được hàm mà nó trỏ tới.

edit: VD trên mình lấy từ trong cuốn Head First C ra, còn chỗ nào không đúng các bạn đừng gạch đá

Bùi Tống Minh Châu viết 23:47 ngày 30/09/2018

Nếu sử dụng tốt thì con trỏ hàm sẽ trở nên rất lợi hại, lúc trước mình có dùng để làm một chương trình và đã giảm được khoảng 250 dòng code

Bài liên quan
0