Fungsi Penunjuk dalam Pengaturcaraan C dengan Contoh

Isi kandungan:

Anonim

Pointer memberikan banyak kemungkinan fungsi 'C' yang kita terhad untuk mengembalikan satu nilai. Dengan parameter penunjuk, fungsi kita sekarang dapat memproses data sebenar dan bukan salinan data.

Untuk mengubah nilai sebenar pemboleh ubah, pernyataan panggilan menyampaikan alamat ke parameter penunjuk dalam fungsi.

Dalam tutorial ini, anda akan belajar-

  • Contoh Petunjuk Fungsi
  • Berfungsi dengan Parameter Array
  • Fungsi yang Mengembalikan Array
  • Petunjuk Fungsi
  • Array of Fungsi Penunjuk
  • Fungsi Menggunakan Penunjuk yang tidak sah
  • Petunjuk Fungsi sebagai Hujah

Contoh Petunjuk Fungsi

Sebagai contoh, program seterusnya menukar dua nilai 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;}}

Pengeluaran:

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

Program menukar nilai pemboleh ubah sebenar kerana fungsi mengaksesnya dengan alamat menggunakan pointer. Di sini kita akan membincangkan proses program:

  1. Kami menyatakan fungsi yang bertanggungjawab untuk menukar dua nilai pemboleh ubah, yang mengambil dua penunjuk bilangan bulat sebagai parameter dan mengembalikan nilai ketika dipanggil.
  2. Dalam fungsi utama, kami menyatakan dan menginisialisasi dua pemboleh ubah integer ('m' dan 'n') kemudian kami mencetak nilainya masing-masing.
  3. Kami memanggil fungsi swap () dengan menyampaikan alamat kedua pemboleh ubah tersebut sebagai argumen menggunakan simbol ampersand. Selepas itu, kami mencetak nilai pemboleh ubah yang baru ditukar.
  4. Di sini kita mendefinisikan isi fungsi swap () yang mengambil dua alamat pemboleh ubah integer sebagai parameter dan menyatakan pemboleh ubah integer sementara yang digunakan sebagai kotak penyimpanan ketiga untuk menyimpan salah satu pemboleh ubah nilai yang akan dimasukkan ke pemboleh ubah kedua.
  5. Simpan kandungan pemboleh ubah pertama yang ditunjukkan oleh 'a' dalam pemboleh ubah sementara.
  6. Simpan pemboleh ubah kedua yang ditunjukkan oleh b pada pemboleh ubah pertama yang ditunjukkan oleh a.
  7. Kemas kini pemboleh ubah kedua (ditunjukkan oleh b) dengan nilai pemboleh ubah pertama yang disimpan dalam pemboleh ubah sementara.

Berfungsi dengan Parameter Array

Di C, kita tidak dapat meneruskan array dengan nilai ke fungsi. Sedangkan, nama array adalah penunjuk (alamat), jadi kami hanya meneruskan nama array ke fungsi yang bermaksud meneruskan penunjuk ke array.

Sebagai contoh, 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);}

Pengeluaran:

 Total summation is 471

Di sini, kami akan menerangkan kod program dengan perinciannya

  1. Kami menyatakan dan menentukan fungsi add_array () yang mengambil alamat array (penunjuk) dengan nombor elemennya sebagai parameter dan mengembalikan jumlah penjumlahan unsur-unsur ini. Penunjuk digunakan untuk mengulang elemen array (menggunakan notasi p [k]), dan kami mengumpulkan penjumlahan dalam pemboleh ubah tempatan yang akan dikembalikan setelah mengulangi keseluruhan array elemen.
  2. Kami menyatakan dan memulakan array integer dengan lima elemen integer. Kami mencetak jumlah penjumlahan 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 penunjuk ke array, seperti dalam program berikut:

#include 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);}

Pengeluaran:

12345

Dan di sini, kita akan membincangkan perincian program

  1. Kami menentukan dan menyatakan fungsi yang mengembalikan alamat array yang mengandungi nilai integer dan tidak mengambil argumen.
  2. Kami menyatakan penunjuk bilangan bulat yang menerima susunan lengkap yang dibina setelah fungsi dipanggil dan kami mencetak kandungannya dengan mengulangi keseluruhan lima elemen elemen.

Perhatikan bahawa penunjuk, bukan array, didefinisikan untuk menyimpan alamat array yang dikembalikan oleh fungsi. Perhatikan juga bahawa apabila pemboleh ubah tempatan dikembalikan dari fungsi, kita harus menyatakannya sebagai statik dalam fungsi.

Petunjuk Fungsi

Seperti yang kita ketahui secara definisi bahawa penunjuk menunjuk ke alamat di setiap lokasi memori, mereka juga dapat menunjukkan pada awal kod yang dapat dilaksanakan sebagai fungsi dalam memori.

Pointer untuk berfungsi dinyatakan dengan *, pernyataan umum deklarasinya adalah:

return_type (*function_name)(arguments)

Anda harus ingat bahawa tanda kurung di sekitar (* function_name) penting kerana tanpa mereka, penyusun akan berfikir fungsi_name mengembalikan pointer of return_type.

Setelah menentukan fungsi penunjuk, kita harus menetapkannya ke fungsi. Sebagai contoh, program seterusnya menyatakan fungsi biasa, menentukan fungsi pointer, menetapkan fungsi pointer ke fungsi biasa dan selepas itu memanggil fungsi melalui pointer:

#include 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");} 

Pengeluaran:

HiHiHi

  1. Kami menentukan dan menyatakan fungsi standard yang mencetak teks Hi kali k yang ditunjukkan oleh masa parameter ketika fungsi dipanggil
  2. Kami menentukan fungsi penunjuk (dengan deklarasi khasnya) yang mengambil parameter integer dan tidak mengembalikan apa-apa.
  3. Kami memulakan fungsi penunjuk kami dengan Hi_function yang bermaksud bahawa penunjuk menunjuk ke Hi_function ().
  4. Daripada memanggil fungsi standard dengan mengetuk nama fungsi dengan argumen, kita memanggil fungsi penunjuk hanya dengan meneruskan nombor 3 sebagai argumen, dan itu saja!

Perlu diingat bahawa nama fungsi menunjuk ke alamat awal kod yang boleh dilaksanakan seperti nama array yang menunjuk ke elemen pertamanya. Oleh itu, arahan seperti function_ptr = & Hi_function dan (* funptr) (3) adalah betul.

CATATAN: Tidak penting untuk memasukkan operator alamat & dan pengendali tidak langsung * semasa penugasan fungsi dan panggilan fungsi.

Array of Fungsi Penunjuk

Pelbagai penunjuk fungsi dapat memainkan peralihan atau peranan pernyataan if untuk membuat keputusan, seperti dalam program berikutnya:

#include 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 48Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: 2624

Di sini, kita membincangkan perincian program:

  1. Kami menyatakan dan menentukan empat fungsi yang mengambil dua argumen integer dan mengembalikan nilai integer. Fungsi-fungsi ini menambah, mengurangkan, mengalikan dan membahagi dua argumen mengenai fungsi mana yang dipanggil oleh pengguna.
  2. Kami menyatakan 4 bilangan bulat untuk mengendalikan operasi, jenis operasi, dan hasil masing-masing. Juga, kami menyatakan susunan empat fungsi penunjuk. Setiap penunjuk fungsi elemen array mengambil dua parameter bilangan bulat dan mengembalikan nilai integer.
  3. Kami menetapkan dan menginisialisasi setiap elemen array dengan fungsi yang telah dinyatakan. Sebagai contoh, elemen ketiga yang merupakan penunjuk fungsi ketiga akan menunjukkan fungsi operasi pendaraban.
  4. Kami mencari operasi dan jenis operasi dari pengguna yang ditaip dengan papan kekunci.
  5. Kami memanggil elemen array yang sesuai (Function pointer) dengan argumen, dan kami menyimpan hasil yang dihasilkan oleh fungsi yang sesuai.

Arahan int (* ope [4]) (int, int); mentakrifkan susunan penunjuk fungsi. Setiap elemen array mesti mempunyai parameter dan jenis pengembalian yang sama.

Hasil penyataan = ope [pilihan] (x, y); menjalankan fungsi yang sesuai mengikut pilihan yang dibuat oleh pengguna Dua bilangan bulat yang dimasukkan adalah argumen yang diteruskan ke fungsi tersebut.

Fungsi Menggunakan Penunjuk yang tidak sah

Petunjuk Void digunakan semasa pengisytiharan fungsi. Kami menggunakan izin jenis void * return untuk mengembalikan jenis apa pun. Sekiranya kita menganggap bahawa parameter kita tidak berubah ketika meneruskan fungsi, kita menyatakannya sebagai konst.

Sebagai contoh:

 void * cube (const void *); 

Pertimbangkan program berikut:

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

Keputusan:

 4 cubed is 64 

Di sini, kita akan membincangkan perincian program:

  1. Kami menentukan dan menyatakan fungsi yang mengembalikan nilai integer dan mengambil alamat pemboleh ubah yang tidak dapat diubah tanpa jenis data tertentu. Kami mengira nilai kubus bagi pemboleh ubah kandungan (x) yang ditunjukkan oleh penunjuk angka, dan kerana ia adalah penunjuk kosong, kita harus mengetikkannya ke jenis data bilangan bulat menggunakan penunjuk notasi (* datatype), dan kita kembali nilai kiub.
  2. Kami menyatakan operasi dan pemboleh ubah hasil. Juga, kami memulakan operasi kami dengan nilai "4."
  3. Kami memanggil fungsi kubus dengan meneruskan alamat operan, dan kami menangani nilai kembali dalam pemboleh ubah hasil

Petunjuk Fungsi sebagai Hujah

Cara lain untuk mengeksploitasi fungsi penunjuk dengan menyampaikannya sebagai argumen ke fungsi lain yang kadang-kadang disebut "fungsi panggilan balik" kerana fungsi penerima "memanggilnya kembali."

Dalam fail header stdlib.h, fungsi "qsort ()" Quicksort menggunakan teknik ini yang merupakan algoritma yang didedikasikan untuk menyusun array.

void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
  • void * base: penunjuk kosong ke larik.
  • size_t num: Nombor elemen tatasusunan.
  • size_t width Ukuran elemen.
  • int (* membandingkan (const void *, const void *): penunjuk fungsi yang terdiri daripada dua argumen dan mengembalikan 0 apabila argumen mempunyai nilai yang sama, <0 ketika arg1 datang sebelum arg2, dan> 0 ketika arg1 muncul setelah arg2.

Program berikut menyusun susunan bilangan bulat dari nombor 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;}

Keputusan:

 13 14 48 50 52 

Di sini, kita akan membincangkan perincian program:

  1. Kami mendefinisikan fungsi membandingkan yang terdiri daripada dua argumen dan mengembalikan 0 apabila argumen mempunyai nilai yang sama, <0 ketika arg1 muncul sebelum arg2, dan> 0 ketika arg1 muncul setelah arg2. Parameter adalah jenis pointer void yang dilemparkan ke jenis data array yang sesuai (bilangan bulat)
  2. Kami menentukan dan menginisialisasi array integer Ukuran array disimpan dalam pemboleh ubah num dan ukuran setiap elemen array disimpan dalam pemboleh ubah lebar menggunakan operator ukuran sizeof () yang ditentukan
  3. Kami memanggil fungsi qsort dan meneruskan nama array, ukuran, lebar, dan fungsi perbandingan yang ditentukan sebelumnya oleh pengguna untuk menyusun susunan kami dalam urutan menaik. Perbandingan akan dilakukan dengan mengambil setiap lelaran dua elemen array sehingga keseluruhan array akan disusun.
  4. Kami mencetak elemen array untuk memastikan bahawa array kami disusun dengan baik dengan mengulangi keseluruhan array menggunakan loop.