0Pricing
C Academy · Pelajaran

Meneruskan Fungsi

Callback sebagai argumen.

Meneruskan Fungsi adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Fungsi sebagai Argumen

Karena pointer fungsi hanyalah sebuah nilai, Anda dapat meneruskan fungsi ke fungsi lain. Fungsi yang diterima disebut panggilan balik.

Dengan demikian, satu rutin dapat menyesuaikan sebagian perilakunya.

#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;
}

Parameter Panggilan Balik

Parameter panggilan balik dideklarasikan seperti variabel pointer fungsi. Di dalam fungsi, Anda memanggilnya seperti fungsi apa pun.

#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;
}

Mengganti Perilaku

Teruskan panggilan balik yang berbeda untuk mendapatkan hasil yang berbeda dari fungsi tingkat tinggi yang sama.

#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;
}

Memetakan Elemen Array

Fungsi map menerapkan panggilan balik ke setiap elemen array secara langsung.

#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;
}

Menyaring dengan Predikat

Predikat adalah panggilan balik yang mengembalikan benar atau salah. Gunakan predikat untuk menghitung atau memilih elemen yang cocok.

#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;
}

Mereduksi Menjadi Satu Nilai

Fungsi reduce menggabungkan array menjadi satu nilai menggunakan panggilan balik biner dan akumulator awal.

#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;
}

Meneruskan Perbandingan

Pengurutan dan pencarian sering menerima panggilan balik perbandingan agar algoritma yang sama dapat digunakan untuk urutan apa pun.

#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 untuk Tipe Panggilan Balik

Memberi nama pada tipe panggilan balik dengan typedef membuat signature fungsi lebih mudah dibaca.

#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;
}

Panggilan Balik Bawaan sebagai Cadangan

Jika panggilan balik mungkin bernilai NULL, sediakan perilaku bawaan agar pemanggil dapat memilih untuk tidak menggunakannya.

#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;
}

Panggilan Balik Memisahkan Kode

Panggilan balik memungkinkan algoritma umum tetap terpisah dari operasi tertentu. Pustaka menyediakan perulangannya; Anda menyediakan perilakunya.

#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;
}

Memilih Panggilan Balik Saat Program Berjalan

Gabungkan pemilihan kondisi dengan penerusan fungsi: pilih panggilan balik, lalu teruskan ke fungsi tingkat tinggi.

#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;
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang meneruskan fungsi.

Ringkasan

Anda telah mempelajari cara meneruskan fungsi sebagai panggilan balik:

  • Deklarasikan parameter panggilan balik seperti pointer fungsi.
  • Buat fungsi tingkat tinggi seperti map, filter, reduce, dan for_each.
  • Gunakan typedef untuk memberi nama pada tipe panggilan balik.
  • Lindungi pemanggilan dari panggilan balik NULL dengan nilai bawaan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Meneruskan Fungsi” gratis?

Ya — teks lengkap “Meneruskan Fungsi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Meneruskan Fungsi”?

Callback sebagai argumen. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Meneruskan Fungsi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendeklarasikan Pointer Fungsi
  2. Meneruskan Fungsi
  3. qsort dengan Comparator
  4. Tabel Pointer Fungsi
← Kembali ke C Academy