Pointer di C: Apa itu Pointer di Pemrograman C? Jenis
โก Ringkasan Cerdas
Pointer dalam bahasa C adalah variabel yang menyimpan alamat memori dari variabel lain. Pointer memungkinkan alokasi memori dinamis, penanganan array dan string yang efisien, serta struktur data kompleks, menggunakan operator alamat dan dereferensi untuk membaca atau memodifikasi nilai.

Apa itu Pointer dalam C?
A petunjuk Dalam bahasa C, pointer adalah variabel yang menyimpan alamat variabel lain. Pointer juga dapat merujuk ke pointer lain atau ke sebuah fungsi. Pointer dapat ditambah atau dikurangi nilainya untuk menunjuk ke lokasi memori berikutnya atau 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, maka v menyimpan sebuah nilai. Setiap variabel, selain nilainya, juga memiliki alamat, yaitu lokasinya di memori. Alamat dapat diperoleh dengan meletakkan tanda ampersand (&) sebelum nama variabel. Jika Anda mencetak alamat suatu variabel, hasilnya akan terlihat seperti angka acak yang dapat berbeda dari satu eksekusi ke eksekusi lainnya.
Alih-alih menyimpan nilai, pointer menyimpan alamat suatu variabel. Misalnya:
int *y = &v;
| VARIABEL | PENUNJUK |
|---|---|
| A nilai disimpan di a bernama Alamat penyimpanan/memori. | A variabel bahwa menunjuk ke alamat penyimpanan/memori lain variabel. |
Mendeklarasikan Pointer
Seperti variabel, pointer masuk pemrograman C Pointer harus dideklarasikan sebelum dapat digunakan. Deklarasi pointer memiliki bentuk sebagai berikut:
data_type *pointer_variable_name;
Di sini, tipe data adalah tipe dasar pointer dan menunjukkan tipe variabel yang ditunjuk oleh pointer tersebut. Tanda bintang (*), simbol yang sama yang digunakan untuk perkalian, adalah operator indirection yang mendeklarasikan pointer. Beberapa deklarasi pointer yang valid adalah:
int *ptr_thing; /* pointer to an integer */ int *ptr1, thing; /* ptr1 points to an int; thing is an int */ double *ptr2; /* pointer to a double */ float *ptr3; /* pointer to a float */ char *ch1; /* pointer to a character */
Menginisialisasi Pointer
Setelah mendeklarasikan pointer, kita menginisialisasinya dengan alamat variabel. Jika pointer tidak diinisialisasi dan digunakan, hasilnya bisa tidak terduga dan berpotensi menimbulkan masalah. Untuk mendapatkan alamat variabel, gunakan operator ampersand (&) sebelum nama variabel:
pointer = &variable;
Berikut adalah program sederhana yang mengilustrasikan sebuah pointer:
#include <stdio.h> int main() { int a = 10; // variable declaration int *p; // pointer variable declaration p = &a; // store address of a in pointer p printf("Address stored in p is: %x\n", p); // access the address printf("Value stored in p is: %d\n", *p); // access the value return 0; }
Keluaran:
Address stored in p is: 60ff08 Value stored in p is: 10
| Operator | Arti |
|---|---|
| * | Memiliki dua fungsi: mendeklarasikan pointer, dan mengembalikan nilai variabel yang dirujuk (dereferensi). |
| & | Hanya memiliki satu tujuan: mengembalikan alamat suatu variabel. |
Jenis Pointer di C
Pointer Null
Kita membuat pointer null dengan menetapkan nilai NULL saat deklarasi. Ini berguna ketika belum ada alamat yang ditetapkan ke pointer. Pointer null selalu berisi nilai 0:
#include <stdio.h> int main() { int *p = NULL; // null pointer printf("The value inside variable p is: %x", p); return 0; }
Penunjuk Batal
Pointer void, juga disebut pointer generik, tidak memiliki tipe data standar. Pointer ini dibuat menggunakan kata kunci void dan dapat menyimpan alamat variabel apa pun:
#include <stdio.h> int main() { void *p = NULL; // void pointer printf("The size of pointer is: %d\n", sizeof(p)); return 0; }
Anjing Pointer Liar
Pointer disebut pointer liar jika tidak diinisialisasi ke apa pun. Pointer ini tidak efisien karena dapat menunjuk ke lokasi memori yang tidak dikenal, yang dapat menyebabkan masalah dan membuat program macet. Selalu berhati-hati dengan pointer liar:
#include <stdio.h> int main() { int *p; // wild pointer printf("%d", *p); return 0; }
Jenis pointer lain dalam bahasa C meliputi dangling pointer, complex pointer, near pointer, far pointer, dan huge pointer.
Penunjuk Akses Langsung dan Tidak Langsung
Dalam bahasa C, terdapat dua cara yang setara untuk mengakses dan memanipulasi isi variabel. Akses langsung menggunakan nama variabel secara langsung, sedangkan akses tidak langsung menggunakan pointer ke variabel tersebut:
#include <stdio.h> int var = 1; /* declare and initialize an int variable */ int *ptr; /* declare a pointer to int */ int main(void) { ptr = &var; /* point ptr to var */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); *ptr = 48; /* change var through the pointer */ printf("\nIndirect access, var = %d", *ptr); return 0; }
Pointer Aritmatika di C
Saat bekerja dengan pointer, perhatikan aturan prioritas berikut. Operator * dan & memiliki prioritas yang sama dengan operator unary (negasi !, penambahan ++, pengurangan โ). Dalam ekspresi yang sama, operator unary *, &, !, ++, dan โ 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:
| Ekspresi | Ekspresi Setara |
|---|---|
| Y = *P + 1 | Y = X + 1 |
| *P = *P + 10 | X = X + 10 |
| *P += 2 | X += 2 |
| ++*Hal | ++X |
| (*P)++ | X++ |
Pada kasus terakhir, tanda kurung diperlukan: karena operator unary * dan ++ dievaluasi dari kanan ke kiri, tanpa tanda kurung pointer P akan bertambah, bukan objek yang ditunjuknya. Operasi aritmatika yang tersedia pada pointer adalah penugasan, penambahan dan pengurangan, serta penjumlahan atau pengurangan.tracting sebuah offset bilangan bulat, yang menggeser penunjuk sebanyak elemen tersebut (setiap langkah sama dengan ukuran dalam byte dari tipe dasar).
Pointer dan Array dalam Bahasa C Beserta Contoh-Contohnya
Secara tradisional, kita mengakses elemen array menggunakan indeks, tetapi pointer juga mempermudah hal ini. Pointer yang diatur ke nama array menunjuk ke elemen pertama:
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; // array initialization int *p; // pointer declaration p = a; // p points to the first element; same as &a[0] for (int i = 0; i < 5; i++) { printf("%d\n", *p); // print element p++; // move to the next element } return 0; }
Menambahkan angka ke pointer akan menggesernya ke depan sebanyak angka tersebut. Jika p menunjuk ke lokasi memori 0, maka p + 1 membuat pointer menunjuk ke lokasi memori 1.
C Pointer dan String dengan Contoh
String adalah larik objek char yang diakhiri dengan karakter null '\0'. Kita dapat memanipulasi string menggunakan pointer:
#include <stdio.h> #include <string.h> 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); p = str; // reset the pointer for (int i = 0; i < strlen(str); i++) { printf("%c\n", *p); p++; } return 0; }
Cara lain untuk menangani string adalah dengan menggunakan array pointer:
#include <stdio.h> int main() { char *materials[] = {"iron", "copper", "gold"}; for (int i = 0; i < 3; i++) printf("%s\n", materials[i]); return 0; }
Keuntungan Pointer di C
- Pointer berguna untuk mengakses lokasi memori secara langsung.
- Mereka menyediakan cara yang efisien untuk mengakses elemen-elemen dalam sebuah array.
- Fungsinya adalah untuk alokasi dan dealokasi memori dinamis.
- Mereka digunakan untuk membentuk struktur data kompleks seperti linked list, graph, dan tree.
Kekurangan Pointer di C
- Petunjuk agak rumit untuk dipahami.
- Hal ini dapat menyebabkan kesalahan seperti kesalahan segmentasi atau akses ke lokasi memori yang tidak diinginkan.
- Nilai yang salah yang diberikan kepada pointer dapat menyebabkan kerusakan memori.
- Pointer juga bertanggung jawab atas kebocoran memori jika memori tidak dibebaskan.
- Merupakan tanggung jawab programmer untuk menangani pointer dengan hati-hati.
