C membuat array dan pointer tidak dapat dipisahkan. Anda tidak dapat menulis kode yang efektif tanpa memahami hubungannya. Butuh waktu untuk menguasainya. Imbalannya adalah kendali langsung atas memori.
Pertimbangkan pengaturan dasar. Anda mendeklarasikan dua array bilangan bulat berukuran sepuluh.
Kompilasi ini. Itu gagal. Anda tidak dapat menugaskan satu array ke array lainnya menggunakan tanda sama dengan. C tidak mendukung penyalinan massal melalui operator penugasan. Untuk menyalin a ke b, Anda harus mengulang setiap elemen.
Anda dapat memampatkan loop itu menjadi satu baris dengan operator koma, tetapi keterbacaannya terganggu. Pendekatan standarnya adalah menggunakan memcpy dari string.h. Ini menangani salinan tingkat byte secara efisien.
Kegagalan b=a mengungkapkan aturan mendasar. Di C, variabel array bukanlah array. Itu adalah petunjuk tetap. a dan b adalah pengidentifikasi permanen untuk alamat awal blok memori masing-masing. a menunjuk ke a[0]. b menunjuk ke b[0]. Alamat-alamat ini tidak dapat diubah. Anda tidak dapat mengalihkan nama variabel ke lokasi memori lain. Itu sebabnya penugasannya gagal. Kompiler memperlakukan nama array sebagai penunjuk konstan.
Karena namanya secara efektif adalah sebuah penunjuk, Anda dapat menggunakan aritmatika penunjuk untuk mengakses data. Di sinilah sintaks menjadi kuat.
Di sini, p adalah variabel penunjuk. Anda dapat menetapkan alamat array a ke p. Pernyataan p=a menyalin alamatnya. Sekarang p memiliki nilai yang sama dengan nama array a. Dereferensi p dengan *p mengambil elemen pertama. Outputnya nol.
Perbedaan ini penting karena variabel penunjuk dapat diubah. Anda dapat membuat p menunjuk ke a[1] atau a[5] menggunakan aritmatika. Nama arraynya sendiri tetap tertahan di awal. Fleksibilitas ini memungkinkan fungsi untuk melakukan iterasi melalui memori tanpa menyalin struktur data yang besar. Ini adalah tulang punggung kinerja tingkat rendah di C.
Memahami tautan ini mencegah bug halus. Ini menjelaskan mengapa beberapa fungsi menerima pointer alih-alih sintaksis array. Ini memperjelas tata letak memori. Abaikan saja, dan Anda akan kesulitan dengan kesalahan segmentasi atau penimpaan data yang tidak diinginkan. Pelajarilah, dan Anda akan melihat dengan tepat apa yang dilakukan mesin tersebut.
Sintaksnya mungkin terasa tidak wajar pada awalnya. Arti ganda dari tanda kurung dan tanda bintang membingungkan pemula. Namun begitu model diklik, abstraksinya hilang. Anda dibiarkan dengan alamat dan nilai. Tidak lebih.
Apakah itu sepadan dengan usaha mentalnya? Kode menjadi lebih cepat. Penggunaan memori menurun. Anda mendapatkan akses langsung ke operasi tingkat perangkat keras. Kebanyakan program C mengandalkan

Anda dapat menetapkan variabel array langsung ke pointer karena, pada dasarnya, keduanya pada dasarnya sama.
p=a; berfungsi bukan karena sihir, tetapi karena a meluruh menjadi sebuah pointer. Secara khusus, ini menunjuk ke alamat memori elemen pertama array (indeks 0). Karena elemen tersebut adalah bilangan bulat, a bertindak sebagai penunjuk ke satu int. Mendeklarasikan p sebagai penunjuk bilangan bulat dan menyetelnya sama dengan a hanya membiarkan dua variabel berbagi alamat yang sama. Anda dapat menulis p=&a[0]; sebagai gantinya. Hasilnya identik.
Setelah p terhubung ke awal a, Anda mendapatkan mobilitas. Nama array seperti a adalah konstanta; itu adalah alamat tetap yang tidak dapat diubah. Petunjuk seperti p berbeda. Anda dapat memindahkannya menggunakan aritmatika penunjuk.
Di sinilah C menjadi pintar.
Saat Anda menulis p++;, kompiler tidak hanya menambahkan satu byte ke alamat. Ia tahu p menunjuk ke bilangan bulat. Ia menambahkan byte sizeof(int) sebagai gantinya, mendarat tepat di elemen berikutnya. Jika p menunjuk ke struktur sepanjang 100 byte, p++ akan melompat 100 byte ke depan. C menangani matematika. Anda cukup menggerakkan penunjuknya.
Menyalin Array Tanpa Indeks
Anda dapat menyalin satu array ke array lain menggunakan petunjuk ini. Alih-alih loop standar dengan indeks:
Anda dapat menggunakan petunjuk:
Itu bertele-tele. Anda dapat mengompresnya.
Atau ciutkan menjadi satu baris.
Yang diutamakan operator di sini adalah melakukan angkat berat. * memiliki prioritas lebih tinggi daripada ++, tetapi kenaikan pasca terjadi setelah nilai diambil. Jadi *p++ mengambil nilai saat ini, lalu memindahkan penunjuk. *q++ melakukan hal yang sama untuk tujuan. Penugasan terjadi di antaranya. Ini kompak. Ini cepat. Anda juga mudah salah membaca jika Anda tidak memperhatikan.
Zona Bahaya
Apa yang terjadi jika Anda menekan p atau q melewati akhir array?
C tidak menghentikan Anda.
Kompiler berasumsi Anda tahu apa yang Anda lakukan. Itu akan terus menambah pointer, menyalin data ke memori yang bukan milik array. Anda mungkin menimpa variabel lain. Anda mungkin merusak tumpukan. Anda mungkin akan membuat program crash di kemudian hari, di suatu tempat yang tidak terkait dengan bug tersebut.
Inilah sebabnya mengapa pemeriksaan batas dilakukan secara manual di C. Bahasanya mempercayai Anda. Ketika Anda keluar dari barisan, Anda menanggung akibatnya.
Meneruskan Array ke Fungsi
Anda dapat meneruskan array ke fungsi dengan dua cara. Mereka terlihat berbeda tetapi berperilaku serupa.
Pertimbangkan fungsi yang mencetak array:
Atau versi penunjuk:
Parameter nia (angka dalam array) wajib diisi. Array di C tidak membawa ukurannya. Fungsi tersebut perlu mengetahui kapan harus berhenti.
Dalam kedua kasus tersebut, Anda meneruskan pointer ke awal array, bukan






































