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

ตารางพอยน์เตอร์ฟังก์ชัน

รูปแบบการเลือกส่งงาน

ตารางพอยน์เตอร์ฟังก์ชัน เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตารางฟังก์ชัน

คุณสามารถเก็บพอยน์เตอร์ฟังก์ชันในอาร์เรย์เพื่อสร้างตารางกระจายงาน ดัชนีหรือรหัสจะเลือกฟังก์ชันที่จะทำงาน แทนที่ชุดเงื่อนไข if-else หรือ switch ที่ยาว

#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    int (*ops[2])(int,int) = { add, sub };
    printf("%d\n", ops[0](5, 3));
    printf("%d\n", ops[1](5, 3));
    return 0;
}

การใช้ดัชนีในตาราง

เลือกการดำเนินการขณะโปรแกรมทำงานด้วยการใช้ดัชนีของอาร์เรย์ ดัชนีอาจมาจากข้อมูลป้อนเข้าของผู้ใช้หรือสถานะของโปรแกรม

#include <stdio.h>

int mul(int a, int b) { return a * b; }
int add(int a, int b) { return a + b; }

int main(void) {
    int (*ops[2])(int,int) = { add, mul };
    int choice = 1;
    printf("%d\n", ops[choice](6, 7));
    return 0;
}

การแทนที่ switch

ตารางกระจายงานมักอ่านง่ายกว่า switch เมื่อแต่ละกรณีมีหน้าที่เพียงเรียกฟังก์ชัน

#include <stdio.h>

void start(void) { printf("start\n"); }
void stop(void)  { printf("stop\n"); }
void pause(void) { printf("pause\n"); }

int main(void) {
    void (*table[3])(void) = { start, stop, pause };
    for (int i = 0; i < 3; i++) table[i]();
    return 0;
}

typedef จัดตารางให้กระชับ

การใช้ typedef กับชนิดพอยน์เตอร์ฟังก์ชันทำให้ส่วนประกาศตารางสั้นและอ่านง่าย

#include <stdio.h>

typedef int (*BinOp)(int,int);

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    BinOp ops[] = { add, sub };
    printf("%d\n", ops[0](10, 4));
    return 0;
}

การจับคู่สัญลักษณ์กับฟังก์ชัน

จับคู่สัญลักษณ์ตัวดำเนินการแต่ละตัวกับฟังก์ชันของมันในอาร์เรย์คู่ขนานหรือตารางโครงสร้าง เพื่อค้นหาด้วยชื่อ

#include <stdio.h>

typedef int (*BinOp)(int,int);

int add(int a, int b){return a+b;}
int sub(int a, int b){return a-b;}

int main(void) {
    char syms[] = {'+', '-'};
    BinOp ops[] = { add, sub };
    char want = '-';
    for (int i = 0; i < 2; i++)
        if (syms[i] == want) printf("%d\n", ops[i](9, 2));
    return 0;
}

ตารางคำสั่งแบบโครงสร้าง

รวมชื่อและตัวจัดการไว้ในโครงสร้าง แล้วสร้างอาร์เรย์ของโครงสร้างเหล่านั้น นี่คือรูปแบบตารางคำสั่งแบบคลาสสิก

#include <stdio.h>
#include <string.h>

typedef struct {
    const char *name;
    void (*run)(void);
} Command;

void hello(void){printf("hi\n");}
void bye(void){printf("bye\n");}

int main(void) {
    Command cmds[] = {{"hello", hello}, {"bye", bye}};
    const char *input = "bye";
    for (int i = 0; i < 2; i++)
        if (strcmp(cmds[i].name, input) == 0) cmds[i].run();
    return 0;
}

การตรวจสอบขอบเขต

ตรวจสอบดัชนีให้ถูกต้องก่อนเรียกผ่านตารางทุกครั้ง เพื่อหลีกเลี่ยงการอ่านเลยจุดสิ้นสุดของอาร์เรย์

#include <stdio.h>

typedef int (*Fn)(int);
int sq(int x){return x*x;}
int neg(int x){return -x;}

int main(void) {
    Fn table[] = { sq, neg };
    int n = 2;
    int idx = 5;
    if (idx >= 0 && idx < n) printf("%d\n", table[idx](3));
    else printf("index out of range\n");
    return 0;
}

เครื่องจักรสถานะ

ตารางกระจายงานใช้ขับเคลื่อนเครื่องจักรสถานะ โดยแต่ละสถานะเป็นพอยน์เตอร์ฟังก์ชัน และตัวจัดการจะคืนดัชนีของสถานะถัดไป

#include <stdio.h>

int state_a(void){ printf("A\n"); return 1; }
int state_b(void){ printf("B\n"); return -1; }

int main(void) {
    int (*states[2])(void) = { state_a, state_b };
    int s = 0;
    while (s >= 0) s = states[s]();
    return 0;
}

การกระจายงานแบบปลั๊กอิน

ด้วยการลงทะเบียนตัวจัดการในตาราง คุณสามารถเพิ่มพฤติกรรมใหม่โดยเพิ่มรายการ แทนการแก้ไข switch ขนาดใหญ่

#include <stdio.h>

typedef void (*Handler)(int);
void log_low(int v){printf("low %d\n", v);}
void log_high(int v){printf("high %d\n", v);}

int main(void) {
    Handler handlers[] = { log_low, log_high };
    int level = 1;
    handlers[level](7);
    return 0;
}

ตัวจัดการเริ่มต้น

สงวนช่องหนึ่งช่องหรือพอยน์เตอร์สำรองไว้สำหรับรหัสที่ไม่รู้จัก เพื่อให้การกระจายงานไม่ล้มเหลวอย่างเงียบ ๆ

#include <stdio.h>

typedef void (*Fn)(void);
void known(void){printf("known\n");}
void fallback(void){printf("unknown command\n");}

int main(void) {
    Fn table[] = { known };
    int n = 1, code = 9;
    Fn f = (code >= 0 && code < n) ? table[code] : fallback;
    f();
    return 0;
}

เหตุใดตารางจึงรองรับการขยาย

ตารางกระจายงานเปลี่ยนตรรกะการแตกแขนงให้เป็นการค้นหาข้อมูล การเพิ่มกรณีจึงหมายถึงการเพิ่มข้อมูล ทำให้โค้ดเป็นลำดับที่ไม่ซับซ้อนและทำงานได้รวดเร็ว

#include <stdio.h>

typedef int (*Fn)(int);
int a(int x){return x+1;}
int b(int x){return x*2;}
int c(int x){return x*x;}

int main(void) {
    Fn t[] = { a, b, c };
    for (int i = 0; i < 3; i++) printf("%d ", t[i](4));
    printf("\n");
    return 0;
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเรื่องตารางพอยน์เตอร์ฟังก์ชัน

สรุป

คุณได้เรียนรู้รูปแบบการกระจายงานด้วยตารางพอยน์เตอร์ฟังก์ชัน:

  • เก็บพอยน์เตอร์ฟังก์ชันในอาร์เรย์ แล้วเลือกด้วยดัชนี
  • ใช้แทนชุด switch ที่ยาว และขยายได้ด้วยการเพิ่มข้อมูล
  • ใช้ typedef และตารางคำสั่งแบบโครงสร้างเพื่อให้ชัดเจน
  • ตรวจสอบขอบเขตของดัชนีทุกครั้ง และเตรียมตัวจัดการเริ่มต้น

คำถามที่พบบ่อย

บทเรียน “ตารางพอยน์เตอร์ฟังก์ชัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตารางพอยน์เตอร์ฟังก์ชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตารางพอยน์เตอร์ฟังก์ชัน”

รูปแบบการเลือกส่งงาน คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ตารางพอยน์เตอร์ฟังก์ชัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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