---LESSON_INFO--- **Learning Objectives:** - Memahami konsep pointer dalam bahasa C - Belajar mendeklarasikan dan menggunakan pointer - Mengenal operasi dereferencing dan referencing - Memahami hubungan antara pointer dan array **Prerequisites:** - Pemahaman tentang variabel dan tipe data - Pemahaman dasar tentang memori dalam program ---END_LESSON_INFO--- # Pointer dalam C Pointer juga merupakan variabel dan memainkan peran penting dalam bahasa pemrograman C. Mereka digunakan karena beberapa alasan, seperti: * String * Alokasi memori dinamis * Mengirim argumen fungsi dengan referensi * Membangun struktur data yang rumit * Menunjuk ke fungsi * Membangun struktur data khusus (misalnya Pohon, Trie, dll...) Dan masih banyak lagi. ## Apa itu pointer? Pointer pada dasarnya adalah variabel integer sederhana yang menyimpan alamat memori yang menunjuk ke suatu nilai, bukan menyimpan nilai sebenarnya. Memori komputer adalah penyimpanan data sekuensial, dan pointer menunjuk ke bagian tertentu dari memori. Program kita bisa menggunakan pointer sedemikian rupa sehingga pointer menunjuk ke sejumlah besar memori - tergantung seberapa banyak yang kita putuskan untuk baca dari titik itu. ## String sebagai pointer Kita sudah membahas string, tetapi sekarang kita bisa menggali lebih dalam dan memahami apa sebenarnya string dalam C (yang disebut C-String untuk membedakannya dari string lain ketika dicampur dengan C++) Baris berikut: ```c char * name = "John"; ``` melakukan tiga hal: 1. Ini mengalokasikan variabel lokal (stack) bernama `name`, yang merupakan pointer ke karakter tunggal. 2. Ini menyebabkan string "John" muncul di suatu tempat dalam memori program (setelah dikompilasi dan dieksekusi, tentu saja). 3. Ini menginisialisasi argumen `name` untuk menunjuk ke tempat tinggal karakter `J` (yang diikuti oleh sisa string dalam memori). Jika kita mencoba mengakses variabel `name` sebagai array, itu akan bekerja, dan akan mengembalikan nilai ordinal dari karakter `J`, karena variabel `name` sebenarnya menunjuk tepat ke awal string. Karena kita tahu bahwa memori bersifat sekuensial, kita bisa berasumsi bahwa jika kita bergerak maju dalam memori ke karakter berikutnya, kita akan menerima huruf berikutnya dalam string, sampai kita mencapai akhir string, ditandai dengan terminator nol (karakter dengan nilai ordinal 0, dicatat sebagai `\0`). ## Dereferencing Dereferencing adalah tindakan merujuk ke tempat yang ditunjuk oleh pointer, bukan alamat memori. Kita sudah menggunakan dereferencing dalam array - tetapi kita belum tahu itu. Operator kurung - `[0]` misalnya, mengakses item pertama dari array. Dan karena array sebenarnya adalah pointer, mengakses item pertama dalam array sama dengan dereferencing pointer. Dereferencing pointer dilakukan menggunakan operator asterisk `*`. Jika kita ingin membuat array yang akan menunjuk ke variabel yang berbeda dalam stack kita, kita bisa menulis kode berikut: ```c /* definisikan variabel lokal a */ int a = 1; /* definisikan variabel pointer, dan arahkan ke a menggunakan operator & */ int * pointer_to_a = &a; printf("Nilai a adalah %d\\n", a); printf("Nilai a juga %d\\n", *pointer_to_a); ``` Perhatikan bahwa kita menggunakan operator `&` untuk menunjuk ke variabel `a`, yang baru saja kita buat. Kita kemudian merujuk ke variabel tersebut menggunakan operator dereferencing. Kita juga bisa mengubah isi dari variabel yang di-dereferensikan: ```c int a = 1; int * pointer_to_a = &a; /* mari kita ubah variabel a */ a += 1; /* kita baru saja mengubah variabel lagi! */ *pointer_to_a += 1; /* akan mencetak 3 */ printf("Nilai dari a sekarang %d\\n", a); ``` --- ## Tabel Operasi Pointer dalam C | Operasi | Deskripsi | Contoh | |---------|-----------|--------| | Deklarasi | Mendeklarasikan variabel pointer | `int *ptr;` | | Referencing | Mendapatkan alamat variabel | `&variable` | | Dereferencing | Mengakses nilai di alamat pointer | `*ptr` | | Penugasan | Menetapkan alamat ke pointer | `ptr = &variable;` | ---EXERCISE--- # Latihan: Menggunakan Pointer untuk Menaikkan Nilai Buat pointer ke variabel lokal `n` bernama `pointer_to_n`, dan gunakan untuk meningkatkan nilai `n` sebesar satu. **Requirements:** - Buat pointer ke variabel n - Gunakan pointer untuk menaikkan nilai n - Pastikan pointer menunjuk ke alamat variabel n **Expected Output:** ``` Done! ``` Try writing your solution in the code editor below! ---EXPECTED_OUTPUT--- Done! ---END_EXPECTED_OUTPUT--- ---INITIAL_CODE--- #include int main() { int n = 10; /* kode Anda di sini */ /* pengujian kode */ if (pointer_to_n != &n) return 1; if (*pointer_to_n != 11) return 1; printf("Done!\\n"); return 0; } ---END_INITIAL_CODE--- ---SOLUTION_CODE--- #include int main() { int n = 10; int * pointer_to_n = &n; *pointer_to_n += 1; /* pengujian kode */ if (pointer_to_n != &n) return 1; if (*pointer_to_n != 11) return 1; printf("Done!\\n"); return 0; } ---END_SOLUTION_CODE---