Fungsi Pointer pada Pemrograman C beserta Contohnya

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. Kami mendeklarasikan fungsi yang bertanggung jawab untuk menukar dua nilai variabel, yang mengambil dua pointer bilangan bulat 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. Daripada memanggil fungsi standar dengan menempelkan nama fungsi dengan argumen, kita hanya memanggil fungsi penunjuk dengan meneruskan 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 mengambil dua argumen bilangan bulat dan mengembalikan nilai bilangan bulat. Fungsi-fungsi ini menambah, mengurangi, mengalikan, dan membagi dua argumen mengenai 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. Kami menyebutnya qsort fungsi dan meneruskan nama array, ukuran, lebar, dan fungsi perbandingan yang 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.