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.

Baca Juga:

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().

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 -