0Pricing
C Academy · บทเรียน

การส่งฟังก์ชัน

ใช้การเรียกกลับเป็นอาร์กิวเมนต์

การส่งฟังก์ชัน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การประกาศพอยน์เตอร์ฟังก์ชัน
  2. การส่งฟังก์ชัน
  3. qsort กับตัวเปรียบเทียบ
  4. ตารางพอยน์เตอร์ฟังก์ชัน
← กลับไปที่ C Academy