Hãy làm một hàm map
-like cho C.
void apply(int *arr, size_t len, int (*func)(int))
{
for(size_t i = 0; i < len; i++)
arr[i] = func(arr[i]);
}
Bằng cách đó, chúng ta có thể biến đổi một chức năng hoạt động trên nguyên để làm việc trên mảng các số nguyên. Chúng tôi cũng có thể thực hiện một phiên bản tương tự:
void apply_enumerated(int *arr, size_t len, int (*func)(size_t, int))
{
for(size_t i = 0; i < len; i++)
arr[i] = func(i, arr[i]);
}
Điều này cũng giống như vậy, nhưng cho phép chức năng của chúng tôi biết yếu tố nào được bật.Chúng ta có thể sử dụng này, ví dụ:
int cube(int i) { return i * i * i }
void print_array(int *array, size_t len, char *sep)
{
if(sep == NULL) sep = ", ";
printf("%d", *array);
for(size_t i = 1; i < len; i++) printf("%s%d", sep, array[i])
}
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
int main(void)
{
int array[5] = { 1, 2, 3, 4, 5 };
print_array(array, ARRAY_SIZE(array), NULL);
apply(array, ARRAY_SIZE(array), cube);
print_array(array, ARRAY_SIZE(array), NULL);
return 0;
}
Đó là mã sẽ in:
1, 2, 3, 4, 5
1, 8, 27, 64, 125
Ví dụ liệt kê của chúng tôi:
int mult(size_t i, int j) { return i * j }
// print_array and ARRAY_SIZE as before
int main(void)
{
int array[5] = { 1, 2, 3, 4, 5 };
print_array(array, ARRAY_SIZE(array), NULL);
apply_enumerated(array, ARRAY_SIZE(array), mult);
print_array(array, ARRAY_SIZE(array), NULL);
return 0;
}
in này:
1, 2, 3, 4, 5
0, 2, 6, 12, 20
Như một ví dụ thế giới thực hơn, thư viện vòng có thể có một hàm áp dụng một hàm hoạt động trên các ký tự đơn cho tất cả các ký tự trong chuỗi. Ví dụ về các chức năng như vậy là chức năng chuẩn của thư viện toupper()
và tolower()
trong ctype.h
- chúng tôi có thể sử dụng chức năng string_apply()
này để thực hiện chức năng string_toupper()
dễ dàng.
Nhìn vào hàm thư viện chuẩn 'qsort()' và xem điều đó có giúp bạn không. –
http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work/840669#840669 –
Chúng cũng được sử dụng dưới nắp hệ điều hành rất nhiều .. Giống như tôi đã tạo một hệ điều hành với khung điều khiển bằng cách sử dụng rất nhiều con trỏ hàm .. Chúng rất tiện dụng vì nó giống như các phương thức 'virtual/abstract' ngoại trừ bạn phải kiểm soát nó và quản lý nó .. – Earlz