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

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

ส่งฟังก์ชันเป็นอาร์กิวเมนต์

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

พอยน์เตอร์ฟังก์ชันคืออะไร

พอยน์เตอร์ฟังก์ชันจะเก็บที่อยู่ของฟังก์ชันไว้ เพื่อให้คุณเรียกใช้ฟังก์ชันนั้นทางอ้อม หรือส่งต่อไปเหมือนข้อมูลได้

  • ชนิดของพอยน์เตอร์จะเข้ารหัสลายเซ็นของฟังก์ชัน
  • ช่วยให้ฟังก์ชันรับพฤติกรรมเป็นพารามิเตอร์ได้
#include <iostream>

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

int main() {
    int (*op)(int, int) = add;
    std::cout << op(3, 4) << '\n';
    return 0;
}

การประกาศชนิด

การประกาศ int (*op)(int, int) อ่านได้ว่า: op เป็นพอยน์เตอร์ไปยังฟังก์ชันที่รับค่า int สองค่าและส่งคืนค่า int วงเล็บรอบ *op เป็นสิ่งจำเป็น

#include <iostream>

int square(int x) { return x * x; }

int main() {
    int (*fn)(int) = square;
    std::cout << fn(5) << '\n';
    return 0;
}

การเรียกใช้ผ่านพอยน์เตอร์

คุณเรียกใช้พอยน์เตอร์ฟังก์ชันได้เหมือนกับฟังก์ชันนั้นโดยตรง นอกจากนี้ยังสามารถถอดการอ้างอิงอย่างชัดเจนได้ แต่แทบไม่จำเป็นต้องทำ

#include <iostream>

void greet() { std::cout << "Hello\n"; }

int main() {
    void (*g)() = greet;
    g();
    (*g)();
    return 0;
}

การส่งฟังก์ชันเป็นอาร์กิวเมนต์

ฟังก์ชันสามารถรับพารามิเตอร์ชนิดพอยน์เตอร์ฟังก์ชันได้ ทำให้ผู้เรียกกำหนดพฤติกรรมแบบกำหนดเองได้

#include <iostream>

int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }

int main() {
    std::cout << apply(10, doubler) << '\n';
    return 0;
}

การเลือกขณะทำงาน

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

#include <iostream>

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

int main() {
    bool wantAdd = true;
    int (*op)(int, int) = wantAdd ? add : sub;
    std::cout << op(8, 3) << '\n';
    return 0;
}

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

เก็บพอยน์เตอร์ฟังก์ชันหลายตัวไว้ในอาร์เรย์ เพื่อสร้างตารางกระจายงานอย่างง่ายที่จัดทำดัชนีด้วยค่า

#include <iostream>

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

int main() {
    int (*ops[2])(int, int) = {add, mul};
    std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
    return 0;
}

การใช้ชนิดนามแฝง

ไวยากรณ์ของพอยน์เตอร์ดูยุ่งยาก คำสั่งกำหนดชนิดใหม่หรือชื่อแทนที่สร้างด้วย using จะทำให้ชนิดนั้นมีชื่อที่อ่านเข้าใจได้

#include <iostream>

using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }

int main() {
    BinOp op = add;
    std::cout << op(6, 7) << '\n';
    return 0;
}

พอยน์เตอร์ฟังก์ชันกับอัลกอริทึม

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

#include <iostream>
#include <vector>
#include <algorithm>

bool isEven(int n) { return n % 2 == 0; }

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    int c = std::count_if(v.begin(), v.end(), isEven);
    std::cout << "Evens: " << c << '\n';
    return 0;
}

ข้อจำกัด: ไม่มีสถานะ

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

#include <iostream>

int counter = 0;
int next() { return ++counter; }

int main() {
    int (*fn)() = next;
    std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
    return 0;
}

แลมบ์ดาที่ไม่จับค่าจะถูกแปลง

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

#include <iostream>

int main() {
    int (*fn)(int) = [](int x) { return x + 100; };
    std::cout << fn(1) << '\n';
    return 0;
}

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

พอยน์เตอร์ฟังก์ชันสามารถเป็น nullptr ได้ ซึ่งหมายความว่าพอยน์เตอร์นั้นไม่ได้ชี้ไปที่ใดเลย โปรดตรวจสอบก่อนเรียกใช้เสมอ เพื่อหลีกเลี่ยงพฤติกรรมที่ไม่ได้กำหนด

#include <iostream>

int main() {
    int (*fn)(int) = nullptr;
    if (fn) {
        std::cout << fn(5) << '\n';
    } else {
        std::cout << "No function set\n";
    }
    return 0;
}

ตรวจสอบอย่างรวดเร็ว

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

สรุปทบทวน

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

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

ถัดไป คุณจะได้รู้จัก std::function ซึ่งสามารถเก็บสิ่งที่เรียกใช้งานได้ทุกชนิด รวมถึงชนิดที่มีสถานะ

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

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

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

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

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

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

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

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

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

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

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

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

  1. พอยน์เตอร์ฟังก์ชัน
  2. std::function
  3. std::bind
  4. การเลือกสิ่งที่เรียกใช้งานได้
← กลับไปที่ C++ Academy