การส่งฟังก์ชัน
ใช้การเรียกกลับเป็นอาร์กิวเมนต์
การส่งฟังก์ชัน เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันในฐานะอาร์กิวเมนต์
เนื่องจากพอยน์เตอร์ฟังก์ชันเป็นเพียงค่า คุณจึงส่งฟังก์ชันเข้าไปยังอีกฟังก์ชันได้ ฟังก์ชันที่รับเข้ามานี้เรียกว่า ฟังก์ชันเรียกกลับ
วิธีนี้ทำให้กระบวนการหนึ่งสามารถปรับแต่งพฤติกรรมบางส่วนของตัวเองได้
#include <stdio.h>
int apply(int x, int (*f)(int)) {
return f(x);
}
int square(int x) { return x * x; }
int main(void) {
printf("%d\n", apply(6, square));
return 0;
}พารามิเตอร์ของฟังก์ชันเรียกกลับ
พารามิเตอร์ของฟังก์ชันเรียกกลับประกาศเช่นเดียวกับตัวแปรพอยน์เตอร์ฟังก์ชัน ภายในฟังก์ชัน คุณเรียกใช้พารามิเตอร์นี้ได้เหมือนฟังก์ชันทั่วไป
#include <stdio.h>
void run_twice(void (*action)(void)) {
action();
action();
}
void beep(void) { printf("beep\n"); }
int main(void) {
run_twice(beep);
return 0;
}การสลับพฤติกรรม
ส่งฟังก์ชันเรียกกลับที่ต่างกัน เพื่อให้ฟังก์ชันระดับสูงเดียวกันคืนผลลัพธ์ที่ต่างกัน
#include <stdio.h>
int combine(int a, int b, int (*op)(int, int)) {
return op(a, b);
}
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
printf("%d\n", combine(3, 4, add));
printf("%d\n", combine(3, 4, mul));
return 0;
}การแปลงสมาชิกในอาร์เรย์
ฟังก์ชัน map ใช้ฟังก์ชันเรียกกลับกับสมาชิกทุกตัวของอาร์เรย์โดยตรง
#include <stdio.h>
void map(int *a, int n, int (*f)(int)) {
for (int i = 0; i < n; i++) a[i] = f(a[i]);
}
int inc(int x) { return x + 1; }
int main(void) {
int a[] = {1, 2, 3};
map(a, 3, inc);
for (int i = 0; i < 3; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}การกรองด้วยเพรดิเคต
เพรดิเคตคือฟังก์ชันเรียกกลับที่คืนค่าเป็นจริงหรือเท็จ ใช้เพรดิเคตเพื่อนับหรือเลือกสมาชิกที่ตรงเงื่อนไข
#include <stdio.h>
int count_if(int *a, int n, int (*pred)(int)) {
int c = 0;
for (int i = 0; i < n; i++) if (pred(a[i])) c++;
return c;
}
int is_even(int x) { return x % 2 == 0; }
int main(void) {
int a[] = {1,2,3,4,5,6};
printf("%d\n", count_if(a, 6, is_even));
return 0;
}การลดเหลือค่าเดียว
ฟังก์ชัน reduce รวมอาร์เรย์ให้เหลือค่าเดียว โดยใช้ฟังก์ชันเรียกกลับแบบไบนารีและตัวสะสมเริ่มต้น
#include <stdio.h>
int reduce(int *a, int n, int init, int (*op)(int,int)) {
int acc = init;
for (int i = 0; i < n; i++) acc = op(acc, a[i]);
return acc;
}
int add(int a, int b) { return a + b; }
int main(void) {
int a[] = {1,2,3,4};
printf("%d\n", reduce(a, 4, 0, add));
return 0;
}การส่งฟังก์ชันเปรียบเทียบ
การเรียงลำดับและการค้นหามักรับฟังก์ชันเรียกกลับสำหรับเปรียบเทียบ เพื่อให้อัลกอริทึมเดียวกันใช้ได้กับลำดับทุกแบบ
#include <stdio.h>
int max_by(int a, int b, int (*greater)(int,int)) {
return greater(a, b) ? a : b;
}
int gt(int a, int b) { return a > b; }
int main(void) {
printf("%d\n", max_by(3, 8, gt));
return 0;
}typedef สำหรับชนิดฟังก์ชันเรียกกลับ
การตั้งชื่อชนิดของฟังก์ชันเรียกกลับด้วย typedef ทำให้รูปแบบฟังก์ชันอ่านง่ายขึ้น
#include <stdio.h>
typedef int (*IntFn)(int);
int apply(int x, IntFn f) { return f(x); }
int neg(int x) { return -x; }
int main(void) {
printf("%d\n", apply(5, neg));
return 0;
}ฟังก์ชันเรียกกลับสำรองเริ่มต้น
หากฟังก์ชันเรียกกลับอาจเป็น NULL ให้กำหนดพฤติกรรมเริ่มต้น เพื่อให้ผู้เรียกเลือกไม่ใช้ฟังก์ชันเรียกกลับได้
#include <stdio.h>
int apply(int x, int (*f)(int)) {
if (f == NULL) return x;
return f(x);
}
int dbl(int x) { return x * 2; }
int main(void) {
printf("%d\n", apply(9, NULL));
printf("%d\n", apply(9, dbl));
return 0;
}ฟังก์ชันเรียกกลับแยกส่วนโค้ด
ฟังก์ชันเรียกกลับทำให้อัลกอริทึมทั่วไปไม่ขึ้นอยู่กับการดำเนินการเฉพาะ ไลบรารีจัดการลูป ส่วนคุณเป็นผู้กำหนดพฤติกรรม
#include <stdio.h>
void for_each(int *a, int n, void (*visit)(int)) {
for (int i = 0; i < n; i++) visit(a[i]);
}
void show(int x) { printf("[%d]", x); }
int main(void) {
int a[] = {7, 8, 9};
for_each(a, 3, show);
printf("\n");
return 0;
}การเลือกฟังก์ชันเรียกกลับขณะทำงาน
ผสานการเลือกตามเงื่อนไขเข้ากับการส่งค่า: เลือกฟังก์ชันเรียกกลับ แล้วส่งให้ฟังก์ชันระดับสูง
#include <stdio.h>
int apply(int x, int (*f)(int)) { return f(x); }
int sq(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main(void) {
int power = 3;
int (*f)(int) = (power == 2) ? sq : cube;
printf("%d\n", apply(2, f));
return 0;
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเรื่องการส่งฟังก์ชัน
สรุป
คุณได้เรียนรู้การส่งฟังก์ชันในฐานะฟังก์ชันเรียกกลับ:
- ประกาศพารามิเตอร์ของฟังก์ชันเรียกกลับเช่นเดียวกับพอยน์เตอร์ฟังก์ชัน
- สร้างฟังก์ชันระดับสูง เช่น map, filter, reduce และ for_each
- ใช้
typedefเพื่อตั้งชื่อชนิดของฟังก์ชันเรียกกลับ - ป้องกันฟังก์ชันเรียกกลับที่เป็น
NULLด้วยพฤติกรรมเริ่มต้น
คำถามที่พบบ่อย
บทเรียน “การส่งฟังก์ชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การส่งฟังก์ชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การส่งฟังก์ชัน”
ใช้การเรียกกลับเป็นอาร์กิวเมนต์ คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การส่งฟังก์ชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ