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 & */
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: