Apa itu Pointer di C?
The Pointer dalam C, adalah variabel yang menyimpan alamat dari variabel lain. Penunjuk juga dapat digunakan untuk merujuk ke fungsi penunjuk lainnya. Sebuah pointer dapat ditambah / dikurangi, yaitu untuk menunjuk ke lokasi memori berikutnya / sebelumnya. Tujuan pointer adalah untuk menghemat ruang memori dan mencapai waktu eksekusi yang lebih cepat.
Cara Menggunakan Pointer di C
Jika kita mendeklarasikan variabel v bertipe int, v sebenarnya akan menyimpan nilai.
v sama dengan nol sekarang.
Namun, setiap variabel, selain nilai, juga memiliki alamatnya (atau, sederhananya, di mana ia berada di memori). Alamat dapat diambil dengan meletakkan tanda dan (&) sebelum nama variabel.
Jika Anda mencetak alamat variabel di layar, itu akan terlihat seperti nomor yang benar-benar acak (selain itu, dapat berbeda dari proses ke proses).
Mari kita coba ini dalam praktiknya dengan pointer dalam contoh C.
Output dari program ini adalah -480613588.
Sekarang, apa itu pointer? Alih-alih menyimpan nilai, pointer y akan menyimpan alamat variabel.
Variabel Penunjuk
Int * y = & v;
VARIABEL |
POINTER |
Sebuah nilai yang disimpan dalam bernama penyimpanan alamat / memori |
Sebuah variabel yang menunjuk ke alamat penyimpanan / memori lain variabel |
Mendeklarasikan Pointer
Seperti variabel, pointer dalam pemrograman C harus dideklarasikan sebelum dapat digunakan dalam program Anda. Pointer dapat diberi nama apa pun yang Anda inginkan selama mematuhi aturan penamaan C. Deklarasi pointer memiliki bentuk berikut.
data_type * pointer_variable_name;
Sini,
- data_type adalah tipe dasar pointer dari tipe variabel C dan menunjukkan tipe variabel yang ditunjuk pointer.
- Tanda bintang (*: tanda bintang yang sama yang digunakan untuk perkalian) yang merupakan operator tipuan, menyatakan penunjuk.
Mari kita lihat beberapa deklarasi pointer yang valid dalam tutorial pointer 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 */
Inisialisasi penunjuk
Setelah mendeklarasikan pointer, kami menginisialisasinya seperti variabel standar dengan alamat variabel. Jika pointer dalam pemrograman C tidak diinisialisasi dan digunakan dalam program, hasilnya tidak dapat diprediksi dan berpotensi menjadi bencana.
Untuk mendapatkan alamat variabel, kita menggunakan operator ampersand (&), ditempatkan sebelum nama variabel yang alamatnya kita butuhkan. Inisialisasi penunjuk dilakukan dengan sintaks berikut.
Sintaks Penunjuk
pointer = &variable;
Program sederhana untuk ilustrasi penunjuk diberikan di bawah ini:
#includeint 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;}
Keluaran:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operator | Berarti |
* | Melayani 2 tujuan
|
& | Hanya melayani 1 tujuan
|
Jenis Pointer di C
Berikut adalah berbagai Jenis Pointer di C :
Pointer Nihil
Kita dapat membuat pointer nol dengan menetapkan nilai nol selama deklarasi pointer. Metode ini berguna jika Anda tidak memiliki alamat yang ditetapkan ke penunjuk. Pointer null selalu berisi nilai 0.
Program berikut menggambarkan penggunaan pointer nol:
#includeint main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}
Keluaran:
The value inside variable p is:0
Batal Pointer
Dalam pemrograman C, void pointer juga disebut sebagai pointer generik. Itu tidak memiliki tipe data standar. Sebuah pointer void dibuat dengan menggunakan kata kunci void. Ini dapat digunakan untuk menyimpan alamat variabel apa pun.
Program berikut mengilustrasikan penggunaan void pointer:
#includeint main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Keluaran:
The size of pointer is:4
Pointer liar
Sebuah pointer dikatakan sebagai pointer liar jika tidak diinisialisasi ke apapun. Jenis penunjuk C ini tidak efisien karena mungkin menunjuk ke beberapa lokasi memori yang tidak diketahui yang dapat menyebabkan masalah dalam program kami dan dapat menyebabkan program mogok. Seseorang harus selalu berhati-hati saat bekerja dengan petunjuk liar.
Program berikut menggambarkan penggunaan penunjuk liar:
#includeint main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Keluaran
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Jenis pointer lain di 'c' adalah sebagai berikut:
- Pointer yang menggantung
- Pointer yang kompleks
- Penunjuk dekat
- Pointer jauh
- Pointer besar
Titik Akses Langsung dan Tidak Langsung
Di C, ada dua cara yang setara untuk mengakses dan memanipulasi konten variabel
- Akses langsung: kami menggunakan langsung nama variabel
- Akses tidak langsung: kami menggunakan pointer ke variabel
Mari kita pahami ini dengan bantuan program di bawah ini
#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 program dikompilasi tanpa error, hasilnya adalah:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Pointer Aritmatika di C
Operasi penunjuk dirangkum dalam gambar berikut
Operasi prioritas (diutamakan)
Saat bekerja dengan pointer C, kita harus memperhatikan aturan prioritas berikut:
- Operator * dan & memiliki prioritas yang sama dengan operator unary (negation !, incrementation ++, decrement--).
- Dalam ekspresi yang sama, operator unary *, &,!, ++, - dievaluasi dari kanan ke kiri.
Jika pointer P menunjuk ke variabel X, maka * P dapat digunakan di mana pun X dapat ditulis.
Ekspresi berikut ini setara:
int X = 10 int * P = & Y; Untuk kode di atas, ekspresi di bawah ini benar | |
Ekspresi | Ekspresi Setara |
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ++ | Y = X + 1 X = X + 10 X + = 2 ++ X X ++ |
Dalam kasus terakhir, tanda kurung diperlukan: karena operator unary * dan ++ dievaluasi dari kanan ke kiri, tanpa tanda kurung penunjuk P akan bertambah, bukan objek yang titik P.
Tabel di bawah ini menunjukkan aritmatika dan operasi dasar yang dapat digunakan saat menangani pointer C.
Operasi | Penjelasan |
Tugas | int * P1, * P2 P1 = P2; P1 dan P2 menunjuk ke variabel bilangan bulat yang sama |
Incrementation dan decrementation | Int * P1; P1 ++; P1--; |
Menambahkan offset (Constant) | Ini memungkinkan penunjuk untuk memindahkan elemen N dalam tabel. Pointer akan dinaikkan atau diturunkan sebesar N kali jumlah byte dari tipe variabel. P1 + 5; |
C Pointer & Array dengan Contoh
Secara tradisional, kita mengakses elemen array menggunakan indeksnya, tetapi metode ini dapat dihilangkan dengan menggunakan pointer. Pointer memudahkan untuk mengakses setiap elemen array.
#includeint 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;}
Keluaran
12345
Menambahkan nomor tertentu ke penunjuk akan memindahkan lokasi penunjuk ke nilai yang diperoleh dengan operasi penjumlahan. Misalkan p adalah pointer yang saat ini menunjuk ke lokasi memori 0 jika kita melakukan operasi penjumlahan berikut, p + 1 maka akan dijalankan dengan cara ini:
Karena p saat ini menunjuk ke lokasi 0 setelah menambahkan 1, nilainya akan menjadi 1, dan karenanya penunjuk akan menunjuk ke lokasi memori 1.
C Pointer dan String dengan Contoh
String adalah larik objek char, diakhiri dengan karakter null '\ 0'. Kita bisa memanipulasi string menggunakan pointer. Penunjuk dalam contoh C ini menjelaskan bagian 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 Keluaran
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!Cara lain untuk menangani string adalah dengan berbagai pointer seperti dalam program berikut:
#includeint 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;} Keluaran:
Please remember these materials:ironcoppergoldKeuntungan Pointer di C
- Pointer berguna untuk mengakses lokasi memori.
- Pointer memberikan cara yang efisien untuk mengakses elemen struktur array.
- Pointer digunakan untuk alokasi memori dinamis serta deallocation.
- Pointer digunakan untuk membentuk struktur data yang kompleks seperti daftar tertaut, grafik, pohon, dll.
Kekurangan Pointer di C
- Pointer agak rumit untuk dipahami.
- Pointer dapat menyebabkan berbagai kesalahan seperti kesalahan segmentasi atau dapat mengakses lokasi memori yang tidak diperlukan sama sekali.
- Jika nilai yang salah diberikan ke penunjuk, ini dapat menyebabkan kerusakan memori.
- Pointer juga bertanggung jawab atas kebocoran memori.
- Pointer relatif lebih lambat daripada variabel.
- Programmer merasa sangat sulit untuk bekerja dengan pointer; oleh karena itu adalah tanggung jawab programmer untuk memanipulasi pointer dengan hati-hati.
Ringkasan
- Penunjuk tidak lain adalah lokasi memori tempat data disimpan.
- Penunjuk digunakan untuk mengakses lokasi memori.
- Ada berbagai jenis pointer seperti null pointer, wild pointer, void pointer, dan jenis pointer lainnya.
- Pointer dapat digunakan dengan larik dan string untuk mengakses elemen secara lebih efisien.
- Kita dapat membuat pointer fungsi untuk menjalankan fungsi secara dinamis.
- Operasi aritmatika dapat dilakukan pada sebuah pointer yang dikenal sebagai pointer aritmatika.
- Pointer juga dapat menunjuk ke fungsi yang membuatnya mudah untuk memanggil fungsi yang berbeda dalam hal menentukan larik pointer.
- Saat Anda ingin menangani tipe data variabel yang berbeda, Anda dapat menggunakan pointer void typecast.