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.
char [][20]={
"John come from USA"
"Son come from Viet Nam"
"abcxyz come from Japan"
};
int check_vn(char *s)
{
return strstr(s,"Viet Nam");
}
int check_usa(char *s)
{
return strstr(s,"usa");
}
Hàm duyệt qua từng phần tử
void country_filter(int(*check_fp)(char *))
{
for(int i=0;i<n;i++)
{
if(check_fp(array_of_string[i]))
printf("%s",array_of_string[i])
}
}
int main()
{
//lọc ra những người ở Mĩ
country_filter(check_usa);
//lọc ra những người ở Việt Nam
country_filter(check_vn);
return 0;
}
Mà con trỏ hàm cũng có thể dùng với struct nữa 
typedef struct
{
int weight;
int height;
char *hair_color;
void(*meow)();
}cat;
void keu()
{
printf("Meow Meow Meow");
}
int main()
{
cat my_cat={8,2,"black",keu};
mycat.meow();//in ra meow meow meow, fell like oop
return 0;
}