Pointer Fungsi dalam C: Contoh Praktis dan Praktik Terbaik
Pointer fungsi membuka kemampuan canggih dalam C, memungkinkan fungsi untuk memanipulasi data secara langsung melalui alamat memori daripada menyalin nilai. Dengan meneruskan alamat ke parameter pointer, sebuah fungsi dapat memodifikasi variabel asli, memungkinkan pola seperti penukaran in-place, callback dinamis, dan fungsi higher-order.
Contoh Pointer Fungsi
Fungsi dengan Parameter Array
Fungsi yang Mengembalikan Array
Pointer Fungsi
Array Pointer Fungsi
Fungsi Menggunakan Pointer Void
Pointer Fungsi sebagai Argumen
Contoh Pointer Fungsi
Rutinitas swap klasik menunjukkan bagaimana fungsi dapat menukarkan nilai dua variabel dengan bekerja pada alamatnya.
void swap (int *a, int *b); int main() { int m = 25; int n = 100; printf("m is %d, n is %d\n", m, n); swap(&m, &n); printf("m is %d, n is %d\n", m, n); return 0; } void swap (int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
Output:
m is 25, n is 100 m is 100, n is 25
Deklarasikan swap dengan dua pointer integer.
Inisialisasikan m dan n dalam main dan cetak mereka.
Panggil swap(&m, &n) untuk meneruskan alamat.
Di dalam swap, gunakan variabel sementara untuk menukarkan nilai.
Dereference pointer untuk membaca/menulis data aktual.
Fungsi dengan Parameter Array
Array menjadi pointer saat diteruskan ke fungsi. Program berikut menjumlahkan elemen array dengan mengiterasi pointer.
int add_array (int *a, int num_elements); int main() { int Tab[5] = {100, 220, 37, 16, 98}; printf("Total summation is %d\n", add_array(Tab, 5)); return 0; } int add_array (int *p, int size) { int total = 0; for (int k = 0; k < size; k++) { total += p[k]; /* equivalent to total += *p; p++; */ } return total; }
Output:
Total summation is 471
Definisikan add_array untuk menerima pointer dan ukuran, mengembalikan jumlah.
Teruskan nama array Tab (yang menjadi pointer) dan panjangnya ke fungsi.
Fungsi yang Mengembalikan Array
Sebuah fungsi dapat mengembalikan pointer ke array statis. Pendekatan ini berguna ketika pemanggil memerlukan array sementara tanpa mengelola alokasi memori.
#include <stdio.h> int * build_array(); int main() { int *a; a = build_array(); /* get first 5 even numbers */ for (int k = 0; k < 5; k++) printf("%d\n", a[k]); return 0; } int * build_array() { static int Tab[5] = {1,2,3,4,5}; return Tab; }
Output:
1 2 3 4 5
Deklarasikan fungsi yang mengembalikan pointer ke array statis.
Gunakan pointer yang dikembalikan untuk mengiterasi dan mencetak isi array.
Pointer Fungsi
Pointer fungsi menyimpan alamat titik entri fungsi, memungkinkan dispatch dinamis dan callback. Sintaks deklarasi memerlukan kurung di sekitar bintang untuk menghindari salah penafsiran.
return_type (*function_name)(arguments)
Contoh: Panggil rutinitas melalui pointer.
#include <stdio.h> void Hi_function (int times); /* function */ int main() { void (*function_ptr)(int); /* function pointer */ function_ptr = Hi_function; /* assignment */ function_ptr(3); /* invocation */ return 0; } void Hi_function (int times) { for (int k = 0; k < times; k++) printf("Hi\n"); }
Output:
Hi Hi Hi
Definisikan fungsi reguler.
Deklarasikan pointer fungsi dengan tanda tangan yang benar.
Tetapkan pointer ke nama fungsi.
Panggil fungsi melalui pointer.
Array Pointer Fungsi
Menyimpan beberapa pointer fungsi dalam array memungkinkan pendekatan tabel-driven, mirip dengan pernyataan switch. Program berikut menunjukkan kalkulator sederhana.
#include <stdio.h> int sum(int num1, int num2); int sub(int num1, int num2); int mult(int num1, int num2); int divi(int num1, int num2); int main() { int x, y, choice, result; int (*ope[4])(int, int); ope[0] = sum; ope[1] = sub; ope[2] = mult; ope[3] = divi; printf("Enter two integer numbers: "); scanf("%d%d", &x, &y); printf("Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: "); scanf("%d", &choice); result = ope[choice](x, y); printf("%d", result); return 0; } int sum(int x, int y) {return x + y;} int sub(int x, int y) {return x - y;} int mult(int x, int y) {return x * y;} int divi(int x, int y) {return y != 0 ? x / y : 0;}
Result: Enter 13 48 2 → 624
Definisikan empat fungsi aritmetika.
Buat array empat pointer fungsi dengan tanda tangan yang cocok.
Tetapkan setiap pointer ke fungsi yang sesuai.
Ambil pilihan pengguna dan panggil fungsi yang dipilih.
Fungsi Menggunakan Pointer Void
Pointer void menyediakan akses data yang tidak bergantung pada tipe. Saat digunakan dalam parameter fungsi, mereka memungkinkan rutin untuk menerima tipe data apa pun, asalkan pemanggil menyediakan cast yang benar.
void * cube (const void *);
Contoh program:
#include <stdio.h> void* cube (const void* num); int main() { int x = 4; int cube_int = (int)cube(&x); printf("%d cubed is %d\n", x, cube_int); return 0; } void* cube (const void *num) { int result = (*(int *)num) * (*(int *)num) * (*(int *)num); return (void*)result; }
Result: 4 cubed is 64
Definisikan fungsi yang menerima pointer void konstan dan mengembalikan pointer void.
Cast pointer ke int * untuk mengakses nilai.
Hitung kubus dan cast hasil kembali ke void * untuk dikembalikan.
Pointer Fungsi sebagai Argumen
Meneruskan pointer fungsi ke fungsi lain adalah pola umum untuk callback. Pustaka standar qsort menggunakan teknik ini untuk mengurutkan array tipe apa pun.