Petunjuk dalam Pengaturcaraan C: Apa itu Pointer, Jenis & Contoh

Apakah Pointer dalam C?

The Pointer dalam C, adalah pembolehubah yang menyimpan menangani pembolehubah lain. Penunjuk juga boleh digunakan untuk merujuk kepada fungsi penunjuk yang lain. Penunjuk dapat ditingkatkan / diturunkan, yaitu, untuk menunjuk ke lokasi memori berikutnya / sebelumnya. Tujuan pointer adalah untuk menjimatkan ruang memori dan mencapai masa pelaksanaan yang lebih cepat.

Cara Menggunakan Penunjuk di C

Sekiranya kita menyatakan pemboleh ubah v dari jenis int, v sebenarnya akan menyimpan nilai.

v sama dengan sifar sekarang.

Namun, setiap pemboleh ubah, selain dari nilai, juga memiliki alamatnya (atau, secara sederhana, di mana ia berada dalam memori). Alamat boleh diambil dengan meletakkan ampersand (&) sebelum nama pemboleh ubah.

Sekiranya anda mencetak alamat pemboleh ubah di layar, ia akan kelihatan seperti nombor yang sama sekali rawak (lebih-lebih lagi, ia boleh berbeza dari lari ke jalanan).

Mari cuba praktikkan ini dengan penunjuk dalam contoh C

Keluaran program ini ialah -480613588.

Sekarang, apa itu penunjuk? Daripada menyimpan nilai, penunjuk akan menyimpan alamat pemboleh ubah.

Pemboleh ubah Pointer

Int * y = & v;

BERBAGAI

POINTER

A nilai disimpan dalam dinamakan address penyimpanan / memori

A pembolehubah yang mata kepada alamat penyimpanan / memori lain berubah-ubah

Menyatakan Penunjuk

Seperti pemboleh ubah, penunjuk dalam pengaturcaraan C harus dinyatakan sebelum dapat digunakan dalam program anda. Pointer boleh dinamakan apa sahaja yang anda mahukan selagi mematuhi peraturan penamaan C. Pernyataan penunjuk mempunyai bentuk berikut.

data_type * pointer_variable_name;

Di sini,

  • data_type adalah jenis asas penunjuk jenis pemboleh ubah C dan menunjukkan jenis pemboleh ubah yang ditunjukkan oleh penunjuk.
  • Tanda bintang (*: tanda bintang yang sama digunakan untuk pendaraban) yang merupakan operator tidak langsung, menyatakan penunjuk.

Mari kita lihat beberapa pernyataan penunjuk yang sah dalam tutorial petunjuk C ini:

int *ptr_thing; /* pointer to an integer */int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */double *ptr2; /* pointer to a double */float *ptr3; /* pointer to a float */char *ch1 ; /* pointer to a character */float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */

Memulakan penunjuk

Setelah menyatakan penunjuk, kami menginisialisasi seperti pemboleh ubah standard dengan alamat pemboleh ubah. Sekiranya petunjuk dalam pengaturcaraan C tidak dimulakan dan digunakan dalam program ini, hasilnya tidak dapat diramalkan dan berpotensi menjadi bencana.

Untuk mendapatkan alamat pemboleh ubah, kami menggunakan operator ampersand (&), yang diletakkan sebelum nama pemboleh ubah yang alamatnya kami perlukan. Permulaan penunjuk dilakukan dengan sintaks berikut.

Sintaks Pointer

 pointer = &variable; 

Program sederhana untuk ilustrasi penunjuk diberikan di bawah:

#include int main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}

Pengeluaran:

Address stored in a variable p is:60ff08Value stored in a variable p is:10
Pengendali Makna
* Melayan 2 tujuan
  1. Pengisytiharan penunjuk
  2. Mengembalikan nilai pemboleh ubah yang dirujuk
& Melayan hanya 1 tujuan
  • Mengembalikan alamat pemboleh ubah

Jenis Penunjuk di C

Berikut adalah pelbagai Jenis Penunjuk dalam C :

Penunjuk Null

Kita boleh membuat penunjuk nol dengan memberikan nilai nol semasa pengisytiharan penunjuk. Kaedah ini berguna apabila anda tidak mempunyai alamat yang diberikan kepada penunjuk. Penunjuk nol sentiasa mengandungi nilai 0.

Program berikut menggambarkan penggunaan penunjuk nol:

#include int main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}

Pengeluaran:

The value inside variable p is:0

Kekosongan Penunjuk

Dalam pengaturcaraan C, penunjuk void juga disebut sebagai penunjuk generik. Ia tidak mempunyai jenis data standard. Penunjuk void dibuat dengan menggunakan kata kunci void. Ia boleh digunakan untuk menyimpan alamat sebarang pemboleh ubah.

Program berikut menggambarkan penggunaan penunjuk kekosongan:

#include int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}

Pengeluaran:

The size of pointer is:4

Penunjuk liar

Penunjuk dikatakan sebagai penunjuk liar jika tidak diinisialisasi dengan sesuatu. Jenis penunjuk C ini tidak cekap kerana mungkin menunjuk ke lokasi memori yang tidak diketahui yang boleh menyebabkan masalah dalam program kami dan mungkin menyebabkan program tidak berfungsi. Seseorang harus selalu berhati-hati semasa bekerja dengan petunjuk liar.

Program berikut menggambarkan penggunaan pointer liar:

#include int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}

Pengeluaran

timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main

Jenis penunjuk lain di 'c' adalah seperti berikut:

  • Penunjuk yang menggantung
  • Penunjuk kompleks
  • Berhampiran penunjuk
  • Penunjuk jauh
  • Penunjuk besar

Petunjuk Akses Langsung dan Tidak Langsung

Dalam C, ada dua cara yang setara untuk mengakses dan memanipulasi kandungan yang berubah-ubah

  • Akses terus: kami menggunakan secara langsung nama pemboleh ubah
  • Akses tidak langsung: kami menggunakan penunjuk ke pemboleh ubah

Mari fahami ini dengan bantuan program di bawah

#include /* Declare and initialize an int variable */int var = 1;/* Declare a pointer to int */int *ptr;int main( void ){/* Initialize ptr to point to var */ptr = &var;/* Access var directly and indirectly */printf("\nDirect access, var = %d", var);printf("\nIndirect access, var = %d", *ptr);/* Display the address of var two ways */printf("\n\nThe address of var = %d", &var);printf("\nThe address of var = %d\n", ptr);/*change the content of var through the pointer*/*ptr=48;printf("\nIndirect access, var = %d", *ptr);return 0;}

Setelah menyusun program tanpa sebarang kesalahan, hasilnya adalah:

Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48

Penunjuk Aritmetik di C

Operasi penunjuk diringkaskan dalam gambar berikut

Operasi Penunjuk

Operasi keutamaan (diutamakan)

Semasa bekerja dengan penunjuk C, kita mesti mematuhi peraturan keutamaan berikut:

  • Pengendali * dan & mempunyai keutamaan yang sama dengan pengendali unary (penolakan !, kenaikan ++, pengurangan--).
  • Dalam ungkapan yang sama, pengendali unary *, &,!, ++, - dinilai dari kanan ke kiri.

Sekiranya penunjuk P menunjuk ke pemboleh ubah X, maka * P boleh digunakan di mana sahaja X boleh ditulis.

Ungkapan berikut adalah setara:

int X = 10 int * P = & Y; Untuk kod di atas, ungkapan di bawah adalah benar
Ungkapan Ungkapan Setara
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ​​++ Y = X + 1 X = X + 10 X + = 2 ++ X X ++

Dalam kes terakhir, tanda kurung diperlukan: kerana pengendali unary * dan ++ dinilai dari kanan ke kiri, tanpa tanda kurung, penunjuk P akan meningkat, bukan objek yang menunjukkan P.

Jadual di bawah menunjukkan operasi aritmetik dan asas yang boleh digunakan semasa berurusan dengan C pointers

Operasi Penjelasan
Tugasan int * P1, * P2 P1 = P2; P1 dan P2 menunjukkan pemboleh ubah integer yang sama
Penambahan dan penurunan Int * P1; P1 ++; P1--;
Menambah ofset (Tetap) Ini membolehkan penunjuk memindahkan unsur N dalam jadual. Penunjuk akan dinaikkan atau diturunkan sebanyak N kali bilangan bait dari jenis pemboleh ubah. P1 + 5;

C Penunjuk & Susunan dengan Contoh

Secara tradisional, kami mengakses elemen array menggunakan indeksnya, tetapi kaedah ini dapat dihilangkan dengan menggunakan pointer. Penunjuk memudahkan untuk mengakses setiap elemen array.

#include int main(){int a[5]={1,2,3,4,5}; //array initializationint *p; //pointer declaration/*the ptr points to the first element of the array*/p=a; /*We can also type simply ptr==&a[0] */printf("Printing the array elements using pointer\n");for(int i=0;i<5;i++) //loop for traversing array elements{printf("\n%x",*p); //printing array elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}

Pengeluaran

12345

Menambah nombor tertentu ke penunjuk akan memindahkan lokasi penunjuk ke nilai yang diperoleh dengan operasi penambahan. Katakan p adalah penunjuk yang saat ini menunjuk ke lokasi memori 0 jika kita melakukan operasi penambahan berikut, p + 1 maka ia akan dijalankan dengan cara ini:

Penambahan / Penambahan Penunjuk

Oleh kerana p saat ini menunjuk ke lokasi 0 setelah menambahkan 1, nilainya akan menjadi 1, dan oleh itu penunjuk akan menunjuk ke lokasi memori 1.

C Penunjuk dan Rentetan dengan Contoh

Rentetan adalah susunan objek char, diakhiri dengan watak null '\ 0' Kita boleh memanipulasi rentetan menggunakan pointer. Penunjuk dalam contoh C menerangkan bahagian ini

#include #include int main(){char str[]="Hello Guru99!";char *p;p=str;printf("First character is:%c\n",*p);p =p+1;printf("Next character is:%c\n",*p);printf("Printing all the characters in a string\n");p=str; //reset the pointerfor(int i=0;i

Pengeluaran

First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!

Cara lain untuk menangani rentetan adalah dengan pelbagai petunjuk seperti dalam program berikut:

#include int main(){char *materials[ ] = { "iron", "copper", "gold"};printf("Please remember these materials :\n");int i ;for (i = 0; i < 3; i++) {printf("%s\n", materials[ i ]);}return 0;}

Pengeluaran:

Please remember these materials:ironcoppergold

Kelebihan Penunjuk dalam C

  • Petunjuk berguna untuk mengakses lokasi memori.
  • Pointer menyediakan cara yang berkesan untuk mengakses elemen struktur array.
  • Penunjuk digunakan untuk peruntukan memori dinamik dan juga penyahpindahan.
  • Penunjuk digunakan untuk membentuk struktur data yang kompleks seperti senarai terpaut, grafik, pokok, dll.

Kekurangan Penunjuk dalam C

  • Petunjuk agak rumit untuk difahami.
  • Penunjuk dapat menyebabkan pelbagai kesalahan seperti kesalahan segmentasi atau dapat mengakses lokasi memori yang tidak diperlukan sama sekali.
  • Sekiranya nilai yang salah diberikan kepada penunjuk, ia boleh menyebabkan kerosakan memori.
  • Penunjuk juga bertanggungjawab untuk kebocoran memori.
  • Penunjuk secara relatif lebih perlahan daripada pemboleh ubah.
  • Pengaturcara merasa sukar untuk bekerja dengan petunjuk; oleh itu adalah tanggungjawab pengaturcara untuk memanipulasi penunjuk dengan berhati-hati.

Ringkasan

  • Penunjuk tidak lain adalah lokasi memori di mana data disimpan.
  • Penunjuk digunakan untuk mengakses lokasi memori.
  • Terdapat pelbagai jenis pointer seperti pointer null, pointer liar, pointer void dan jenis pointer lain.
  • Penunjuk dapat digunakan dengan susunan dan rentetan untuk mengakses elemen dengan lebih cekap.
  • Kita boleh membuat penunjuk fungsi untuk memanggil fungsi secara dinamik.
  • Operasi aritmetik boleh dilakukan pada penunjuk yang dikenali sebagai aritmetik penunjuk.
  • Penunjuk juga dapat menunjuk ke fungsi yang memudahkan memanggil fungsi yang berlainan dalam hal menentukan sebilangan penunjuk.
  • Apabila anda ingin menangani jenis data pemboleh ubah yang berbeza, anda boleh menggunakan penunjuk void typecast.

Artikel menarik...