Lompat ke konten Lompat ke sidebar Lompat ke footer

Pointer Ke Fungsi Bahasa C Beserta Penjelasannya

Pada bahasa C, sama seperti bentuk deklarasi pointer secara normal (int *, char *, dan lainnya), dapat pula diciptakan sebuah pointer yang menuju ke fungsi pada Bahasa C.

Sebelum memahami lebih dalam materi tentang Pointer Ke Fungsi Bahasa C Beserta Penjelasannya, terlebih dahulu pelajari materi tentang: Pointer NULL Bahasa C Beserta Fungsi dan Penjelasannya, Pointer Void Bahasa C Beserta Fungsi dan Penjelasannya, dan Pointer VS Array Bahasa C Beserta Penjelasannya.

Contoh: Perhatikan contoh sederhana dari deklarasi dan fungsi yang menggunakan pointer.

#include <stdio.h>


// Sebuah fungsi normal dengan

// parameter integer dan tipe

// return void.

void fun(int a)

{printf("Value of a is %d\n", a);}


int main()

{

// fun_ptr merupakan sebuah

// pointer ke fungsi fun().

void (*fun_ptr)(int) = &fun;


/* Baris sebelumnya adalah

 bernilai sama dengan dua

 variabel fungsi void

 (*fun_ptr)(int); dan fun_ptr

 = &fun;*/


// Memanggil fun() menggunakan

// fun_ptr.

(*fun_ptr)(10);


return 0;

}

Output:
Value of a is 10

Dibutuhkan tanda kurung ekstra pada sekitar fungsi pointer seperti pada fun_ptr, bertujuan untuk mencegah agar ekspresi "void (*fun_ptr)(int)" tidak menjadi "void *fun_ptr(int)" yang merupakan bentuk lain dari deklarasi, yang akan mengembalikan nilai void pointer.

Mendeklarasikan sebuah pointer ke sebuah fungsi:
  • Sebuah pointer ke fungsi tidak menunjuk ke data melainkan ke kode program, biasanya adalah sebuah fungsi pointer akan menyimpan kode eksekusi awal dari suatu fungsi.
  • Tidak perlu melakukan alokasi realokasi memori dengan menggunakan pointer ke fungsi.
  • Nama dari fungsi juga dapat digunakan untuk mendapatkan nilai alamat dari suatu fungsi.
  • Pointer ke fungsi dapat memiliki nilai array dari pointer fungsi itu sendiri.
  • Pointer ke fungsi dapat digunakan pada penempatan switch case.
  • Pointer ke fungsi dapat dilewatkan sebagai nilai argumen dan dapat mengembalikan nilai return dari sebuah fungsi.
  • Pointer ke fungsi merupakan bentuk pointer yang dapat digunakan untuk menghindari redudansi pada penulisan kode program.
  • Memungkinkan untuk menggunakan pemrograman berorientasi objek pada C++ yang diimplementasikan dengan menggunakan pointer ke fungsi pada bahasa C.

Contoh: pada program berikut dilakukan penghapusan alamat operator '&' dalam suatu bentuk penugasan bahasa C. Tidak hanya itu, juga dilakukan perubahan pada fungsi pemanggil dengan menghapus operator '*', dimana hasil akhir dari proses kompilasi program adalah program tetap dapat dijalankan secara normal.

#include <stdio.h>

// Sebuah fungsi normal dengan

// parameter integer dan tipe

// return void.

void fun(int a)

{

printf("Value of a is %d\n", a);

}


int main()

{

// & dihapus

void (*fun_ptr)(int) = fun;


// * dihapus 

fun_ptr(10); 


return 0;

}

Output:
Value of a is 10

Contoh:

#include <stdio.h>


void add(int a, int b)

{printf("Addition is %d\n", a+b);}


void subtract(int a, int b)

{printf("Subtraction is %d\n", a-b);}


void multiply(int a, int b)

{printf("Multiplication is %d\n", a*b);}


int main()

{


// fun_ptr_arr adalah array

// dari fungsi pointer.

void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};


unsigned int ch, a = 15, b = 10;


printf("Enter Choice: 0 for add, 1 for subtract and 2 "

"for multiply\n");

scanf("%d", &ch);


if (ch > 2) return 0;

(*fun_ptr_arr[ch])(a, b);


return 0;

}

Output:
Enter Choice: 0 for add, 1 for subtract and 2 for multiply
2
Multiplication is 150


Contoh:

// Sebuah program sederhana

// bahasa C untuk

// memperlihatkan fungsi

// pointer sebagai sebuah

// parameter.

#include <stdio.h>


// Dua contoh fungsi sederhana

void fun1() { printf("Fun1\n"); }

void fun2() { printf("Fun2\n"); }


// Sebuah fungsi yang menerima

// sebuah fungsi sederhana

// sebagai nilai parameter dan

// dilakukan pemanggilan

// fungsi.

void wrapper(void (*fun)())

{fun();}


int main()

{

wrapper(fun1);

wrapper(fun2);


return 0;

}



Contoh: fungsi qsort() dapat digunakan untuk melakukan pengurutan array secara ascending atau dalam bentuk urutan lainnya, pada kondisi struktur array. Tidak hanya itu, dengan penggunaan pointer ke fungsi dan void pointer, sangat dimungkinkan digunakan fungsi qsort untuk jenis tipe data lainnya.

// Contoh penggunaan qsort dan

// comparator pada bahasa C

#include <stdio.h>

#include <stdlib.h>


// Sebuah contoh penggunaan

// fungsi comparator yang

// digunakan untuk mengurutkan

// nilai array integer pada

// urutan ascending.



// Untuk mengurutkan nilai

// array apapun untuk tipe

// data apapun, dan atau

// kriteria apapun, maka

// dibutuhkan sebuah penulisan

// program yang berfungsi

// untuk membandingkan nilai

// dari fungsi tertentu, yang

// dapat disebut sebagai

// qsort().

int compare (const void * a, const void * b)

{return ( *(int*)a - *(int*)b );}


int main ()

{

int arr[] = {10, 5, 15, 12, 90, 80};


int n = sizeof(arr)/sizeof(arr[0]), i;


qsort (arr, n, sizeof(int), compare);


for (i=0; i<n; i++)

printf ("%d ", arr[i]);


return 0;

}

Output:
5 10 12 15 80 90

Sama seperti qsort() yang telah dicontohkan sebelumnya, pada contoh kali ini dilakukan penulisan fungsi lainnya yang dapat digunakan untuk tipe data apapun dan penugasan apapun tanpa perlu menggunakan kode program yang redudansi. Berikut adalah contoh fungsi pencarian yang digunakan untuk tipe data jenis apapun, yang dapat pula digunakan untuk mencari elemen terdekat dengan menuliskan sebuah kostumisasi fungsi perbandingan.

Contoh:

#include <stdio.h>

#include <stdbool.h>


// Sebuah fungsi perbandingan

// yang digunakan untuk proses

// pencarian nilai array

// integer.

bool compare (const void * a, const void * b)

{return ( *(int*)a == *(int*)b );}


// Tujuan umum dari fungsi

// search() adalah untuk

// proses pencarian elemen *x

// dalam array arr[] dari

// arr_size. 



// Catatan: void pointer juga

// digunakan pada program ini,

// sehingga fungsi dapat

// dipanggil oleh sebuah

// pointer dari tipe apapun. 



//ele_size adalah ukuran dari

// elemen array.

int search(void *arr, int arr_size, int ele_size, void *x,

bool compare (const void * , const void *))

{

// Karena char mengambil nilai

// sebesar satu btyle, maka

// dapat digunakan char

// pointer untuk tipe data

// apapun. 


// Untuk mendapatkan nilai

// aritmatika pointer yang

// benar, maka dibutuhkan

// proses perkalian indeks

// dengan nilai ukuran dari

// elemen array ele_size.

char *ptr = (char *)arr;

int i;


for (i=0; i<arr_size; i++)

if (compare(ptr + i*ele_size, x))

return i;

// Jika nilai elemen tidak

// ditemukan.

return -1;

}


int main()

{

int arr[] = {2, 5, 7, 90, 70};

int n = sizeof(arr)/sizeof(arr[0]);

int x = 7;


printf ("Returned index is %d ", search(arr, n,

sizeof(int), &x, compare));


return 0;

}

Output:
Returned index is 2

Catatan: Fungsi pencarian yang telah dibuat sebelumnya, dapat digunakan untuk tipe data jenis apapun yang ditulis terpisah dengan menggunakan fungsi compare().

Pointer ke fungsi merupakan salah satu fitur penting dalam bahasa C yang memungkinkan pengelolaan fungsi sebagai entitas yang dapat disimpan dalam variabel, diteruskan sebagai parameter, dan dipanggil melalui referensi. Konsep ini memberikan fleksibilitas tinggi dalam pengembangan perangkat lunak, terutama dalam konteks sistem yang memerlukan pengambilan keputusan dinamis, pemrograman berbasis event, atau implementasi algoritma yang kompleks.

Pada dasarnya, pointer ke fungsi adalah sebuah variabel yang menyimpan alamat memori dari sebuah fungsi. Sama seperti pointer ke data, pointer ke fungsi tidak hanya menyimpan alamat tetapi juga mampu "menunjuk" ke lokasi tertentu di memori. Dalam konteks ini, lokasi yang ditunjuk adalah posisi dimana fungsi yang bersangkutan didefinisikan dalam program.

Pointer ke fungsi memungkinkan pemrograman lebih modular dan dinamis. Salah satu manfaatnya adalah penggunaan callback function, yaitu teknik dimana sebuah fungsi diteruskan sebagai parameter untuk dipanggil oleh fungsi lain. Callback sering dimanfaatkan dalam pengembangan aplikasi berbasis antarmuka pengguna atau dalam implementasi algoritma seperti sorting yang membutuhkan kustomisasi logika perbandingan.

Pemanfaatan pointer ke fungsi juga berguna dalam menciptakan struktur data yang lebih fleksibel, seperti tabel vektor fungsi. Tabel vektor fungsi adalah array yang setiap elemennya merupakan pointer ke fungsi. Pendekatan ini sering digunakan dalam implementasi sistem operasi atau driver perangkat keras, dimana fungsionalitas spesifik dihubungkan secara dinamis berdasarkan keadaan runtime.

Dalam konteks efisiensi, penggunaan pointer ke fungsi mengurangi kebutuhan akan struktur kode yang rumit. Sebagai contoh, alih-alih membuat banyak pernyataan kondisi atau blok switch-case yang panjang, tabel pointer ke fungsi dapat digunakan untuk memilih dan menjalankan fungsi yang relevan dengan cara yang lebih ringkas dan cepat.

Keamanan dan keakuratan dalam penggunaan pointer ke fungsi menjadi perhatian penting. Penanganan pointer yang salah dapat menyebabkan kesalahan akses memori, seperti dereferensi pointer yang tidak valid. Oleh karena itu, penting memastikan bahwa pointer ke fungsi selalu diinisialisasi dengan benar dan tidak dibiarkan mengarah ke alamat memori yang tidak valid.

Pointer ke fungsi memiliki aturan tipe yang ketat. Tipe fungsi yang ditunjuk harus sesuai dengan tipe pointer yang mendeklarasikannya. Ketidakcocokan tipe dapat mengakibatkan perilaku tak terduga saat pointer digunakan untuk memanggil fungsi. Untuk memastikan kompatibilitas tipe, deklarasi pointer ke fungsi harus mencantumkan parameter dan tipe pengembalian yang sesuai dengan fungsi yang ditunjuk.

Selain itu, pointer ke fungsi sering digunakan dalam pemrograman generik, dimana algoritma dirancang agar dapat diterapkan pada berbagai tipe data atau operasi. Salah satu contohnya adalah penerapan algoritma sorting yang dapat disesuaikan dengan berbagai kriteria perbandingan melalui penggunaan pointer ke fungsi sebagai parameter.

Dalam pengembangan sistem yang melibatkan banyak komponen, pointer ke fungsi memungkinkan desain arsitektur perangkat lunak yang lebih modular. Komponen-komponen dapat dihubungkan melalui fungsi-fungsi yang diatur secara dinamis, tanpa perlu memodifikasi kode sumber utama. Hal ini tidak hanya meningkatkan fleksibilitas tetapi juga mempermudah pemeliharaan dan pengembangan lebih lanjut.

Penggunaan pointer ke fungsi juga mendukung implementasi polimorfisme dalam konteks pemrograman prosedural. Polimorfisme, yang biasanya dikaitkan dengan paradigma pemrograman berorientasi objek, dapat diwujudkan dalam bahasa C melalui kombinasi pointer ke fungsi dan struktur data. Dengan pendekatan ini, fungsi-fungsi yang berbeda dapat dipanggil melalui pointer yang sama berdasarkan tipe data atau kondisi runtime tertentu.

Namun, implementasi pointer ke fungsi memerlukan pemahaman mendalam tentang manajemen memori dan tipe data dalam bahasa C. Kesalahan dalam mengelola pointer dapat mengakibatkan bug yang sulit dilacak, seperti crash aplikasi atau kebocoran memori. Oleh karena itu, pengujian dan debugging menjadi bagian integral dalam pengembangan perangkat lunak yang melibatkan pointer ke fungsi.

Dalam aplikasi praktis, pointer ke fungsi sering digunakan dalam sistem embedded, dimana sumber daya perangkat keras terbatas dan efisiensi menjadi prioritas utama. Pointer ke fungsi membantu mengurangi overhead eksekusi kode dengan memungkinkan pengambilan keputusan yang cepat dan eksekusi fungsi secara langsung melalui referensi alamat.

Pointer ke fungsi juga memiliki peran penting dalam implementasi library atau API. Dalam library, fungsi-fungsi dapat diekspor sebagai pointer untuk digunakan oleh aplikasi yang mengimpor library tersebut. Pendekatan ini memberikan fleksibilitas tinggi bagi pengembang dalam mengintegrasikan dan memanfaatkan fungsionalitas yang disediakan library.

Pada akhirnya, pointer ke fungsi adalah alat yang sangat berguna dalam pemrograman C, terutama ketika digunakan dengan hati-hati dan bijaksana. Meskipun membutuhkan pemahaman mendalam dan kehati-hatian dalam implementasinya, manfaat yang ditawarkan dalam hal efisiensi, modularitas, dan fleksibilitas membuatnya menjadi komponen penting dalam pengembangan perangkat lunak tingkat lanjut.

Artikel ini didedikasikan kepada: Sri Haryanti, Ulil Amri, Wahyu Isnaini Hutami, Adam Yanuar Rizky, dan Agus Wulansari.

5 komentar untuk "Pointer Ke Fungsi Bahasa C Beserta Penjelasannya"

  1. Apa yang dimaksud dengan pointer ke fungsi Bahasa C?

    BalasHapus
    Balasan

    1. Pointer ke fungsi Bahasa C merupakan pointer yang menunjuk ke alamat kode fungsi yang dapat dieksekusi.

      Hapus
    2. Pointer ke fungsi dapat digunakan untuk memanggil fungsi dan meneruskan nilai fungsi tersebut sebagai argumen ke fungsi lainnya yang memerlukan.

      Hapus
    3. Metode pemanggilan pointer untuk meneruskan argumen ke suatu fungsi, dalah dengan cara menyalin alamat argumen ke dalam parameter formal.

      Hapus
    4. Di dalam fungsi, alamat pointer digunakan untuk mengakses argumen aktual yang digunakan dalam proses pemanggilan, yang berarti bahwa perubahan yang dilakukan pada parameter memengaruhi nilai argumen yang diteruskan.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -