Fungsi Pointer pada Pemrograman C beserta Contohnya

⚡ Ringkasan Cerdas

Pointer fungsi dalam bahasa C menyimpan alamat kode yang dapat dieksekusi, memungkinkan program untuk memanggil fungsi secara tidak langsung, meneruskannya sebagai argumen, membangun tabel pengiriman dari array, dan mengimplementasikan fungsi callback seperti rutin perbandingan qsort untuk desain yang fleksibel dan dapat digunakan kembali.

  • 🔗 Pernyataan: Pointer fungsi menggunakan format return_type (*name)(arguments); tanda kurung di sekitar nama bersifat wajib.
  • 🔄 Tukar berdasarkan alamat: Meneruskan alamat variabel ke parameter pointer memungkinkan sebuah fungsi untuk mengubah nilai asli pemanggil, seperti pada contoh pertukaran.
  • 📦 Array: Nama array sudah berupa pointer, sehingga fungsi dapat menerima array atau mengembalikan pointer ke array statis.
  • Tabel pengiriman: Array pointer fungsi menggantikan rangkaian switch atau if yang panjang dengan mengindeks langsung ke operasi yang dipilih.
  • 🧊 pointer kosong: Tipe parameter atau nilai kembalian void * menerima tipe apa pun, yang akan dikonversi kembali oleh fungsi sebelum digunakan.
  • 📞 Panggilan balik: Meneruskan pointer fungsi sebagai argumen akan mengaktifkan fungsi callback seperti fungsi perbandingan qsort.
  • 🤖 Bantuan AI: GitHub Copilot dan asisten AI menyusun sintaks penunjuk fungsi, typedef, dan tanda tangan callback, kemudian menandai parameter yang tidak cocok.

Pointer Fungsi dalam C

Pointer memberikan kemungkinan besar pada fungsi 'C' yang mana kita dibatasi untuk mengembalikan satu nilai. Dengan parameter penunjuk, fungsi kita sekarang dapat memproses data aktual, bukan salinan data.

Untuk mengubah nilai sebenarnya dari variabel, pernyataan pemanggil meneruskan alamat ke parameter penunjuk dalam suatu fungsi.

Contoh Fungsi Pointer

Misalnya, program berikutnya menukar dua nilai dari dua:

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

Keluaran:

m is 25, n is 100
m is 100, n is 25

Contoh Fungsi Pointer

Program menukar nilai variabel sebenarnya karena fungsi mengaksesnya berdasarkan penggunaan alamat petunjuk. Di sini kita akan membahas proses program:

  1. Kita mendeklarasikan fungsi yang bertanggung jawab untuk pertukaranping dua nilai variabel, yang menerima dua pointer integer sebagai parameter dan mengembalikan nilai apa pun saat dipanggil.
  2. Pada fungsi utama, kita mendeklarasikan dan menginisialisasi dua variabel integer ('m' dan 'n') lalu kita mencetak nilainya masing-masing.
  3. Kita memanggil fungsi swap() dengan meneruskan alamat kedua variabel sebagai argumen menggunakan simbol ampersand. Setelah itu, kami mencetak nilai variabel baru yang ditukar.
  4. Di sini kita mendefinisikan konten fungsi swap() yang mengambil dua alamat variabel integer sebagai parameter dan mendeklarasikan variabel integer sementara yang digunakan sebagai kotak penyimpanan ketiga untuk menyimpan salah satu variabel nilai yang akan dimasukkan ke variabel kedua.
  5. Simpan isi variabel pertama yang ditunjuk oleh 'a' dalam variabel sementara.
  6. Simpan variabel kedua yang ditunjuk oleh b dalam variabel pertama yang ditunjuk oleh a.
  7. Perbarui variabel kedua (ditunjuk oleh b) dengan nilai variabel pertama yang disimpan dalam variabel sementara.

Fungsi dengan Parameter Array

Di C, kita tidak bisa meneruskan array berdasarkan nilai ke suatu fungsi. Padahal nama array adalah sebuah pointer (alamat), jadi kita tinggal meneruskan nama array ke suatu fungsi yang artinya meneruskan pointer ke array tersebut.

Misalnya, kita pertimbangkan program berikut ini:

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;
  int k;
  for (k = 0; k < size; k++) {
    total += p[k];  /* it is equivalent to total +=*p ;p++; */}
 return (total);}

Keluaran:

 Total summation is 471

Di sini kami akan menjelaskan kode program beserta detailnya

Fungsi dengan Parameter Array

  1. Kami mendeklarasikan dan mendefinisikan fungsi add_array() yang mengambil alamat array (pointer) dengan nomor elemennya sebagai parameter dan mengembalikan total akumulasi penjumlahan elemen-elemen ini. Pointer digunakan untuk mengulangi elemen array (menggunakan notasi p[k]), dan kami mengumpulkan penjumlahannya dalam variabel lokal yang akan dikembalikan setelah mengulangi seluruh elemen array.
  2. Kami mendeklarasikan dan menginisialisasi array integer dengan lima elemen integer. Kami mencetak penjumlahan total dengan meneruskan nama array (yang bertindak sebagai alamat) dan ukuran array ke tambahkan_array()disebut fungsi sebagai argumen.

Fungsi yang Mengembalikan Array

Dalam C, kita dapat mengembalikan pointer ke sebuah array, seperti dalam program berikut:

#include <stdio.h>
int * build_array();
int main() {
  int *a;
  a = build_array(); /* get first 5 even numbers */
  for (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);}

Keluaran:

1
2
3
4
5

Dan disini kita akan membahas detail programnya

Fungsi yang Mengembalikan Array

  1. Kami mendefinisikan dan mendeklarasikan fungsi yang mengembalikan alamat array yang berisi nilai integer dan tidak menggunakan argumen apa pun.
  2. Kami mendeklarasikan pointer bilangan bulat yang menerima array lengkap yang dibangun setelah fungsi dipanggil dan kami mencetak isinya dengan mengulangi seluruh array lima elemen.

Perhatikan bahwa pointer, bukan array, didefinisikan untuk menyimpan alamat array yang dikembalikan oleh fungsi. Perhatikan juga bahwa ketika variabel lokal dikembalikan dari suatu fungsi, kita harus mendeklarasikannya sebagai statis dalam fungsi tersebut.

Penunjuk Fungsi

Seperti yang kita ketahui secara definisi bahwa pointer menunjuk ke suatu alamat di lokasi memori mana pun, mereka juga dapat menunjuk ke awal kode yang dapat dieksekusi sebagai fungsi dalam memori.
Pointer ke fungsi dideklarasikan dengan *, pernyataan umum deklarasinya adalah:

return_type (*function_name)(arguments)

Anda harus ingat bahwa tanda kurung di sekitar (*nama_fungsi) penting karena tanpa tanda kurung tersebut, kompiler akan mengira nama_fungsi mengembalikan penunjuk tipe_pengembalian.
Setelah mendefinisikan pointer fungsi, kita harus menetapkannya ke suatu fungsi. Misalnya, program berikut mendeklarasikan suatu fungsi biasa, mendefinisikan pointer fungsi, menetapkan pointer fungsi ke fungsi biasa, dan setelah itu memanggil fungsi melalui pointer:

#include <stdio.h>
void Hi_function (int times); /* function */
int main() {
  void (*function_ptr)(int);  /* function pointer Declaration */
  function_ptr = Hi_function;  /* pointer assignment */
  function_ptr (3);  /* function call */
 return 0;}
void Hi_function (int times) {
  int k;
  for (k = 0; k < times; k++) printf("Hi\n");}

Keluaran:

Hi
Hi
Hi

Fungsi Pointer di C

  1. Kita mendefinisikan dan mendeklarasikan fungsi standar yang mencetak teks Hi sebanyak k kali yang ditunjukkan oleh waktu parameter saat fungsi tersebut dipanggil
  2. Kami mendefinisikan fungsi pointer (dengan deklarasi khususnya) yang mengambil parameter integer dan tidak mengembalikan apa pun.
  3. Kami menginisialisasi fungsi penunjuk kami dengan Hi_function yang berarti penunjuk menunjuk ke Hi_function().
  4. Alih-alih pemanggilan fungsi standar oleh taping Nama fungsi beserta argumennya, kita hanya memanggil fungsi penunjuk dengan memberikan angka 3 sebagai argumen, dan selesai!

Ingatlah bahwa nama fungsi menunjuk ke alamat awal kode yang dapat dieksekusi seperti nama array yang menunjuk ke elemen pertamanya. Oleh karena itu, instruksi seperti function_ptr = &Hi_function dan (*funptr)(3) sudah benar.
CATATAN: Tidak penting untuk memasukkan operator alamat & dan operator tipuan * selama penetapan fungsi dan pemanggilan fungsi.

Array Penunjuk Fungsi

Array penunjuk fungsi dapat memainkan peran saklar atau pernyataan if untuk membuat keputusan, seperti pada program berikutnya:

#include <stdio.h>
int sum(int num1, int num2);
int sub(int num1, int num2);
int mult(int num1, int num2);
int div(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] = div;
  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 div(int x, int y) {if (y != 0) return (x / y); else  return 0;}
Enter two integer numbers: 13 48
Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: 2
624

Di sini, kami membahas detail programnya:

Array Penunjuk Fungsi

  1. Kami mendeklarasikan dan mendefinisikan empat fungsi yang menerima dua argumen bilangan bulat dan mengembalikan nilai bilangan bulat. Fungsi-fungsi ini melakukan penjumlahan, pengurangantract, kalikan dan bagi kedua argumen yang berkaitan dengan fungsi mana yang dipanggil oleh pengguna.
  2. Kami mendeklarasikan 4 bilangan bulat untuk masing-masing menangani operan, jenis operasi, dan hasil. Juga, kami mendeklarasikan array yang terdiri dari empat penunjuk fungsi. Setiap penunjuk fungsi elemen array mengambil dua parameter bilangan bulat dan mengembalikan nilai bilangan bulat.
  3. Kami menetapkan dan menginisialisasi setiap elemen array dengan fungsi yang sudah dideklarasikan. Misalnya, elemen ketiga yang merupakan penunjuk fungsi ketiga akan menunjuk ke fungsi operasi perkalian.
  4. Kami mencari operan dan jenis operasi dari pengguna yang mengetik dengan keyboard.
  5. Kami memanggil elemen array yang sesuai (Penunjuk fungsi) dengan argumen, dan kami menyimpan hasil yang dihasilkan oleh fungsi yang sesuai.

Instruksi int (*ope[4])(int, int); mendefinisikan array pointer fungsi. Setiap elemen array harus memiliki parameter dan tipe kembalian yang sama.
Hasil pernyataan = ope[choice](x, y); menjalankan fungsi yang sesuai sesuai dengan pilihan yang dibuat oleh pengguna. Dua bilangan bulat yang dimasukkan adalah argumen yang diteruskan ke fungsi tersebut.

Fungsi Menggunakan Void Pointer

Void pointer digunakan selama deklarasi fungsi. Kami menggunakan izin jenis pengembalian void * untuk mengembalikan jenis apa pun. Jika kita berasumsi bahwa parameter kita tidak berubah ketika meneruskan ke suatu fungsi, kita mendeklarasikannya sebagai const.
Sebagai contoh:

 void * cube (const void *);

Perhatikan program berikut ini:

#include <stdio.h>
void* cube (const void* num);
int main() {
  int x, cube_int;
  x = 4;
  cube_int = cube (&x);
  printf("%d cubed is %d\n", x, cube_int);
  return 0;}

void* cube (const void *num) {
  int result;
  result = (*(int *)num) * (*(int *)num) * (*(int *)num);
  return result;}

Hasil:

 4 cubed is 64

Di sini, kami akan membahas detail programnya:

Fungsi Menggunakan Void Pointer

  1. Kami mendefinisikan dan mendeklarasikan fungsi yang mengembalikan nilai integer dan mengambil alamat variabel yang tidak dapat diubah tanpa tipe data tertentu. Kita menghitung nilai kubus dari variabel konten (x) yang ditunjuk oleh penunjuk angka, dan karena ini adalah penunjuk kosong, kita harus mengetikkannya ke tipe data integer menggunakan penunjuk notasi tertentu (* tipe data), dan kita kembalikan nilai kubus.
  2. Kami mendeklarasikan operan dan variabel hasil. Selain itu, kami menginisialisasi operan kami dengan nilai “4.”
  3. Kita memanggil fungsi kubus dengan meneruskan alamat operan, dan kita menangani nilai yang dikembalikan dalam variabel hasil

Pointer Fungsi sebagai Argumen

Cara lain untuk mengeksploitasi penunjuk fungsi dengan meneruskannya sebagai argumen ke fungsi lain, terkadang disebut “fungsi panggilan balik” karena fungsi penerima “memanggilnya kembali”.
Dalam file header stdlib.h, fungsi Quicksort “qsort()” menggunakan teknik ini yang merupakan algoritma yang didedikasikan untuk mengurutkan array.

void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
  • void *base : void penunjuk ke array.
  • size_t num : Nomor elemen array.
  • size_t lebar Ukuran elemen.
  • int (*bandingkan (const void *, const void *) : penunjuk fungsi terdiri dari dua argumen dan mengembalikan 0 ketika argumen memiliki nilai yang sama, <0 ketika arg1 muncul sebelum arg2, dan >0 ketika arg1 muncul setelah arg2.

Program berikut mengurutkan array integer dari angka kecil ke besar menggunakan fungsi qsort():

#include <stdio.h>
#include <stdlib.h>
int compare (const void *, const void *); 
int main() {
  int arr[5] = {52, 14, 50, 48, 13};
  int num, width, i;
  num = sizeof(arr)/sizeof(arr[0]);
  width = sizeof(arr[0]);
  qsort((void *)arr, num, width, compare);
  for (i = 0; i < 5; i++)
    printf("%d ", arr[ i ]);
  return 0;}
int compare (const void *elem1, const void *elem2) {
  if ((*(int *)elem1) == (*(int *)elem2))  return 0;
  else if ((*(int *)elem1) < (*(int *)elem2)) return -1;
  else return 1;}

Hasil:

 13 14 48 50 52

Di sini, kami akan membahas detail programnya:

Pointer Fungsi sebagai Argumen

  1. Kita mendefinisikan fungsi perbandingan yang terdiri dari dua argumen dan mengembalikan 0 ketika argumen memiliki nilai yang sama, <0 ketika arg1 muncul sebelum arg2, dan >0 ketika arg1 muncul setelah arg2. Parameternya adalah tipe pointer kosong yang dicor ke tipe data array yang sesuai (bilangan bulat)
  2. Kami mendefinisikan dan menginisialisasi array integer. Ukuran array disimpan di num variabel dan ukuran setiap elemen array disimpan dalam variabel lebar menggunakan sizeof() yang telah ditentukan sebelumnya operator C.
  3. Kita memanggil fungsi qsort dan memberikan nama array, ukuran, lebar, dan fungsi perbandingan yang telah ditentukan sebelumnya oleh pengguna untuk mengurutkan array kita dalam urutan menaik. Perbandingan akan dilakukan dengan mengambil dua elemen array pada setiap iterasi hingga seluruh array terurut.
  4. Kami mencetak elemen array untuk memastikan bahwa array kami diurutkan dengan baik dengan mengulangi seluruh array menggunakan untuk loop.

Pertanyaan Umum Demo Slot

Ya. Pointer fungsi harus sama persis dengan tipe kembalian dan daftar parameter fungsi target. Memberikan fungsi dengan tanda tangan yang berbeda merupakan perilaku yang tidak terdefinisi, meskipun berhasil dikompilasi, karena panggilan tersebut akan memasukkan dan membaca argumen secara tidak benar saat runtime.

typedef memberikan nama pendek pada tipe pointer fungsi yang kompleks. Menulis typedef int (*Operation)(int, int); memungkinkan Anda mendeklarasikan Operation add; alih-alih mengulangi sintaks pointer lengkap, membuat array, parameter, dan anggota struct jauh lebih mudah dibaca.

Pointer fungsi menggerakkan fungsi callback, tabel lompatan atau pengiriman, sistem berbasis plugin dan event-driven, mesin keadaan, dan rutin pustaka seperti qsort dan bsearch. OperaSistem operasi dan firmware tertanam mengandalkan hal tersebut untuk memilih perilaku saat runtime tanpa rantai kondisional yang panjang.

Pointer data menyimpan alamat variabel di memori, sedangkan pointer fungsi menyimpan alamat awal kode yang dapat dieksekusi. Anda memanggil fungsi melalui pointer fungsi untuk menjalankannya, bukan dengan melakukan dereferensi untuk membaca atau menulis data.

Ya. Pointer fungsi dapat diatur ke NULL yang berarti tidak ada fungsi yang ditugaskan. Memanggil pointer fungsi NULL menyebabkan perilaku yang tidak terdefinisi, jadi lindungi panggilan tersebut dengan if (ptr != NULL) sebelum memanggilnya, terutama untuk callback opsional.

Ya. Menempatkan pointer fungsi sebagai anggota struct memungkinkan satu struktur untuk menggabungkan data dengan operasi terkait, meniru objek dan tabel metode virtual. Pola ini mendasari banyak pustaka C dan driver perangkat, di mana setiap instance memilih implementasi fungsinya sendiri.

Ya. Asisten pengkodean AI dapat menghasilkan deklarasi penunjuk fungsi, typedef, dan tanda tangan callback dari perintah bahasa biasa, menjelaskan sintaks yang membingungkan, dan mendeteksi parameter atau tipe pengembalian yang tidak sesuai. Selalu kompilasi dan uji kode yang disarankan sebelum mempercayainya.

Kopilot GitHub Menyarankan sintaks penunjuk fungsi, melengkapi isi callback dari komentar atau tanda tangan, dan mengusulkan fungsi perbandingan qsort. Buka file header yang relevan sehingga penyelesaiannya sesuai dengan prototipe yang Anda deklarasikan, lalu tinjau logikanya.

Ringkaslah postingan ini dengan: