30/09/2018, 22:00
Hỏi đáp về con trỏ hàm trong C
Chào mọi người, mình đang tìm hiểu về con trỏ thì đọc và gặp vấn đề về con trỏ hàm, đọc thấy hay nhưng mà chưa nắm rõ vấn đề lắm ai có thể giúp mình giải thích rõ đoạn này không?
Hàm:
char** album_names(char *artist, int year)
{
...
}
Main:
char** (*names_fn)(char*,int);
names_fn = album_names;
char** results = names_fn("Sacha Distel", 1972);
Bài liên quan
Bạn chưa hiểu chỗ nào.
để tạo 1 con trỏ hàm thì bạn thực hiện theo cú pháp sau:
[kiểu trả vê của hàm][(*tên con trỏ)][danh sách tham số của hàm]
Cú pháp khai báo loằng ngoằng như vậy vì không có 1 kiểu hàm chung. Khi taojh 1 hàm, bạn có thể tùy biến kiểu trả về, danh sách tham số, nên chúng sẽ định nghĩa nên kiểu của hàm. Nếu ta có con trỏ hàm trỏ đến 1 hàm rồi thì có thể gọi hàm đó thông qua con trỏ
ở trong hàm main:
dòng 1: tạo 1 con trỏ hàm với các hàm có kiểu trả về là char**, danh sách tham số là char và int
dòng 2: khởi tạo biến con trỏ vừa rồi, cho nó trỏ đến hàm album_names
dòng 3: gọi hàm thông qua con trỏ hàm
Cảm ơn bạn nts311, mình đã hiểu về cách tạo vào cách sử dụng. Nhưng mà cho mình hỏi thêm là con trỏ hàm nên dùng cho những trường hợp nào? Vì mình thấy dùng con trỏ hàm để gọi hàm đó ra thì không khác gì gọi hàm đơn thuần?
Con trỏ hàm được dùng để tùy biến, giúp cho code được viết có thể sử dụng được nhiều lần một cách hiệu quả nhất, có thể đưa vào thư viện riêng của bạn.
Bạn có thể cho mình 1 ví dụ con con đc không. Cảm ơn bạn
Ví dụ mình có 3 hàm, min, max, socantim, với 1 dãy số, hàm min so sánh 2 số đưa ra số min, tương tự cho max, trong hàm socantim dùng vòng for chạy lặp qua các số, ở đây dùng con trỏ hàm cho hàm min và max, nếu muốn tìm min bạn gán min và ngược lại cho max. Như vậy bạn chỉ cần 3 hàm là đủ, ngoài ra socantim có thể mở rộng ra coa thể tìm số nguyên tố nhỏ nhất, lớn nhất, số chính phương, hoàn hảo gọi chung là hàm điều kiện. Bạn chỉ cần dùng con trỏ hàm điều kiện gán trong hàm socantim là tìm đc số cần tìm, không cần phải viết từng hàm 1. Tùy biến ở đây là mình chỉ cần viết 1 vòng for mà tùy điều kiện cần tìm cho ra kết quả mình mong muốn.
Mình đã hiểu ý bạn, tuy nhiên trong hàm socantim bạn vẫn phải khởi tạo con trỏ hàm (nếu là min thì tạo min, hoặc ngược lại tạo max) Vậy thì sau đó, tùy vào mình chọn min hay max mà mình gán. Nhưng thế thì khi muốn thay đổi thì mình vẫn phải quay về hàm socantim để thay đổi. Mình thấy thêm 1 cái là find() function dùng *match. Mình đưa hàm min hoặc max vào thẳng argument của hàm socantim. Nếu như bạn nói thì dùng cái này hay hơn phải h0k?
Vd bạn có 1 hàm lọc tập hợp các chuỗi. Nó sẽ duyệt qua mọi phàn tử, kiểm tra xem 1 chuỗi có thỏa nãm 1 điều kiện nào không. Giả sử bây giờ bạn muốn kiểm tra nhiều điều khiện riêng rẽ thì bạn sẽ phải sao chép lại rất nhiều code, mà mỗi đoạn code thì chỉ thay đổi có 1 dòng. Như thế sẽ bị lặp code, nên bạn sẽ sử dụng con trỏ hàm để tránh lawepj code: Viết hàm kiểm tra điều kiện, sau đó sử dụng con trỏ hàm làm tham số truyền vào hàm làm công việc duyệt qua tùng phần tử. Sau đó bạn gọi hàm kiểm tra đk thjoong qua con trỏ hàm.
Hàm duyệt qua từng phần tử
Mà con trỏ hàm cũng có thể dùng với struct nữa
Chuẩn rồi nts311 Mình nắm rõ các vấn đề rồi bạn Cảm ơn bạn đã support nhiệt tình