Pointer memberikan kemungkinan besar untuk fungsi 'C' yang dibatasi untuk mengembalikan satu nilai. Dengan parameter pointer, fungsi kita sekarang dapat memproses data aktual daripada salinan data.
Untuk mengubah nilai aktual variabel, pernyataan pemanggil meneruskan alamat ke parameter penunjuk dalam suatu fungsi.
Dalam tutorial ini, Anda akan belajar-
- Contoh Functions Pointers
- Fungsi dengan Parameter Array
- Fungsi yang Mengembalikan Array
- Pointer Fungsi
- Array Penunjuk Fungsi
- Fungsi Menggunakan Pointer void
- Pointer Fungsi sebagai Argumen
Contoh Functions Pointers
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 100m is 100, n is 25
Program menukar nilai variabel aktual karena fungsi mengaksesnya dengan alamat menggunakan pointer. Di sini kita akan membahas proses program:
- Kami mendeklarasikan fungsi yang bertanggung jawab untuk menukar dua nilai variabel, yang mengambil dua pointer integer sebagai parameter dan mengembalikan nilai apa pun saat dipanggil.
- Pada fungsi utama, kita mendeklarasikan dan menginisialisasi dua variabel integer ('m' dan 'n') lalu kita mencetak nilainya masing-masing.
- Kami memanggil fungsi swap () dengan meneruskan alamat dari dua variabel sebagai argumen menggunakan simbol ampersand. Setelah itu, kami mencetak nilai variabel yang baru ditukar.
- 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.
- Simpan konten variabel pertama yang ditunjukkan oleh 'a' di variabel sementara.
- Simpan variabel kedua yang ditunjukkan oleh b di variabel pertama yang ditunjukkan oleh a.
- Perbarui variabel kedua (ditunjukkan oleh b) dengan nilai variabel pertama yang disimpan dalam variabel sementara.
Fungsi dengan Parameter Array
Di C, kita tidak bisa melewatkan array dengan nilai ke suatu fungsi. Padahal, nama array adalah pointer (alamat), jadi kita hanya meneruskan nama array ke suatu fungsi yang berarti meneruskan pointer ke array.
Misalnya, kami mempertimbangkan program berikut:
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
- Kami mendeklarasikan dan mendefinisikan fungsi add_array () yang mengambil alamat array (pointer) dengan nomor elemennya sebagai parameter dan mengembalikan total akumulasi penjumlahan dari elemen-elemen ini. Pointer digunakan untuk mengulang elemen array (menggunakan notasi p [k]), dan kami mengakumulasikan penjumlahan dalam variabel lokal yang akan dikembalikan setelah mengulang seluruh elemen array.
- 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 add_array () yang disebut fungsi sebagai argumen.
Fungsi yang Mengembalikan Array
Di C, kita dapat mengembalikan pointer ke array, seperti pada program berikut:
#includeint * 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:
12345
Dan di sini, kami akan membahas detail program
- Kami mendefinisikan dan mendeklarasikan fungsi yang mengembalikan alamat array yang berisi nilai integer dan tidak mengambil argumen apa pun.
- Kami mendeklarasikan pointer integer yang menerima array lengkap yang dibangun setelah fungsi dipanggil dan kami mencetak isinya dengan mengulang seluruh lima elemen array.
Perhatikan bahwa pointer, bukan array, didefinisikan untuk menyimpan alamat array yang dikembalikan oleh fungsi. Juga perhatikan bahwa ketika variabel lokal dikembalikan dari suatu fungsi, kita harus mendeklarasikannya sebagai statis dalam fungsi tersebut.
Pointer Fungsi
Seperti yang kita ketahui bahwa pointer menunjuk ke 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 (* function_name) penting karena tanpanya, compiler akan mengira function_name mengembalikan pointer dari return_type.
Setelah mendefinisikan penunjuk fungsi, kita harus menugaskannya ke suatu fungsi. Misalnya, program berikutnya mendeklarasikan fungsi biasa, mendefinisikan penunjuk fungsi, menetapkan penunjuk fungsi ke fungsi biasa dan setelah itu memanggil fungsi melalui penunjuk:
#includevoid 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:
HiHiHi
- Kami mendefinisikan dan mendeklarasikan fungsi standar yang mencetak teks Hi k kali yang ditunjukkan oleh parameter kali ketika fungsi tersebut dipanggil
- Kami mendefinisikan fungsi pointer (dengan deklarasi khususnya) yang mengambil parameter integer dan tidak mengembalikan apa pun.
- Kami menginisialisasi fungsi pointer kami dengan Hi_function yang berarti bahwa pointer menunjuk ke Hi_function ().
- Daripada memanggil fungsi standar dengan merekam nama fungsi dengan argumen, kami hanya memanggil fungsi penunjuk dengan meneruskan angka 3 sebagai argumen, dan hanya itu!
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: Tidaklah penting untuk memasukkan operator alamat & dan operator tipuan * selama penetapan fungsi dan pemanggilan fungsi.
Array Penunjuk Fungsi
Array pointer fungsi dapat memainkan peran switch atau if pernyataan untuk membuat keputusan, seperti dalam program berikutnya:
#includeint 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 48Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: 2624
Di sini, kami membahas detail program:
- Kami mendeklarasikan dan mendefinisikan empat fungsi yang mengambil dua argumen integer dan mengembalikan nilai integer. Fungsi-fungsi ini menambah, mengurangi, mengalikan, dan membagi dua argumen terkait fungsi mana yang dipanggil oleh pengguna.
- Kami mendeklarasikan 4 bilangan bulat untuk menangani operan, jenis operasi, dan hasil masing-masing. Juga, kami mendeklarasikan array dari empat penunjuk fungsi. Setiap penunjuk fungsi elemen array mengambil dua parameter bilangan bulat dan mengembalikan nilai bilangan bulat.
- Kami menetapkan dan menginisialisasi setiap elemen array dengan fungsi yang sudah dideklarasikan. Misalnya, elemen ketiga yang merupakan penunjuk fungsi ketiga akan mengarah ke fungsi operasi perkalian.
- Kami mencari operan dan jenis operasi dari pengguna yang diketik dengan keyboard.
- 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 larik penunjuk fungsi. Setiap elemen array harus memiliki parameter dan tipe kembalian yang sama.
Hasil pernyataan = ope [pilihan] (x, y); menjalankan fungsi yang sesuai sesuai dengan pilihan yang dibuat oleh pengguna. Dua bilangan bulat yang dimasukkan adalah argumen yang diteruskan ke fungsi.
Fungsi Menggunakan Pointer void
Pointer kosong digunakan selama deklarasi fungsi. Kami menggunakan izin jenis pengembalian void * untuk mengembalikan jenis apa pun. Jika kita berasumsi bahwa parameter kita tidak berubah saat meneruskan ke suatu fungsi, kita mendeklarasikannya sebagai const.
Sebagai contoh:
void * cube (const void *);
Pertimbangkan program berikut:
#includevoid* 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 program:
- Kami mendefinisikan dan mendeklarasikan fungsi yang mengembalikan nilai integer dan mengambil alamat variabel yang tidak dapat diubah tanpa tipe data tertentu. Kami menghitung nilai kubus dari variabel konten (x) yang ditunjukkan oleh pointer num, dan karena ini adalah pointer kosong, kami harus mengetik cast ke tipe data integer menggunakan pointer notasi (* datatype) tertentu, dan kami mengembalikan nilai kubus.
- Kami mendeklarasikan operan dan variabel hasil. Juga, kami menginisialisasi operand kami dengan nilai "4."
- Kami memanggil fungsi kubus dengan melewatkan alamat operan, dan kami 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 algoritme yang didedikasikan untuk mengurutkan array.
void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
- void * base: penunjuk kosong ke array.
- size_t num: Nomor elemen array.
- size_t width Ukuran elemen.
- int (* bandingkan (const void *, const void *): penunjuk fungsi terdiri dari dua argumen dan mengembalikan 0 jika argumen memiliki nilai yang sama, <0 jika arg1 muncul sebelum arg2, dan> 0 jika arg1 muncul setelah arg2.
Program berikut mengurutkan array bilangan bulat dari angka kecil hingga besar menggunakan fungsi qsort ():
#include#include 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 program:
- Kami mendefinisikan fungsi perbandingan yang terdiri dari dua argumen dan mengembalikan 0 ketika argumen memiliki nilai yang sama, <0 ketika arg1 datang sebelum arg2, dan> 0 ketika arg1 muncul setelah arg2. Parameter adalah tipe pointer kosong yang dicor ke tipe data array yang sesuai (bilangan bulat)
- Kami mendefinisikan dan menginisialisasi array integer Ukuran array disimpan dalam variabel num dan ukuran setiap elemen array disimpan dalam variabel lebar menggunakan operator C sizeof () yang telah ditentukan.
- Kami memanggil fungsi qsort dan meneruskan nama array, ukuran, lebar, dan fungsi perbandingan yang ditentukan sebelumnya oleh pengguna untuk mengurutkan array kami dalam urutan menaik. Perbandingan akan dilakukan dengan mengambil dalam setiap iterasi dua elemen array hingga seluruh array akan diurutkan.
- Kami mencetak elemen array untuk memastikan bahwa array kami diurutkan dengan baik dengan mengulang seluruh array menggunakan for loop.