Setelah array dideklarasikan dan diinisialisasi, tugas kita yang paling sering adalah membaca dan menulis elemen individual. C menggunakan operator subscript [ ] untuk akses elemen array, dengan indeks integer dimulai dari 0. Indeks bisa berupa literal (misal arr[2]), variabel (misal arr[i]), atau ekspresi (misal arr[i + 1]). Pada chapter ini kita akan menelusuri cara membaca, mengubah, dan menavigasi elemen array, sekaligus menjelaskan mengapa indeks berbasis nol di C bukan sekadar konvensi melainkan konsekuensi langsung dari cara compiler menghitung alamat memori.
Operator Subscript [ ] #
Ekspresi arr[i] membaca atau menulis elemen ke-i pada array arr. Di balik layar, compiler menerjemahkan arr[i] menjadi *(arr + i)—yaitu mengambil alamat awal array (arr), menambah offset i * sizeof(elemen) byte, lalu dereference alamat tersebut. Inilah alasan indeks dimulai dari 0: saat i = 0, offset adalah nol, sehingga arr[0] merujuk elemen pertama.
Empat operasi umum pada elemen array:
- Membaca —
x = arr[i]; - Menulis —
arr[i] = x; - Menggabungkan dengan operasi —
arr[i] += 5;(setaraarr[i] = arr[i] + 5;) - Akses via ekspresi indeks —
arr[i + 1],arr[n - 1],arr[2 * k]
Akses Elemen Array #
Contoh berikut mendeklarasikan array harga berisi 5 elemen, lalu memperlihatkan baca, tulis, dan akses via ekspresi indeks.
#include <stdio.h>
int main(void) {
int harga[5] = {15000, 22500, 8000, 45000, 12000};
/* Akses elemen pertama (indeks 0) */
printf("Harga pertama : %d\n", harga[0]);
/* Akses elemen terakhir (indeks 4) */
printf("Harga terakhir : %d\n", harga[4]);
/* Mengubah nilai elemen */
harga[2] = 9500;
printf("Harga setelah diubah: %d\n", harga[2]);
/* Akses via variabel indeks */
int i = 3;
printf("Harga indeks %d: %d\n", i, harga[i]);
/* Mengakses elemen dengan ekspresi */
printf("Harga [4-2] = %d\n", harga[4 - 2]);
return 0;
}Output yang Dihasilkan:
Harga pertama : 15000
Harga terakhir : 12000
Harga setelah diubah: 9500
Harga indeks 3: 45000
Harga [4-2] = 9500Mari kita telaah baris-baris kode di atas:
- Baris 4 (
int harga[5] = {15000, 22500, 8000, 45000, 12000};): deklarasi arrayhargadengan 5 elemen. Elemenharga[0] = 15000,harga[1] = 22500, …,harga[4] = 12000. - Baris 7 (
printf("Harga pertama : %d\n", harga[0]);): membaca elemen pertama dengan indeks0. Operator[]membaca nilai pada alamat&harga[0] + 0 * sizeof(int). - Baris 10 (
printf("Harga terakhir : %d\n", harga[4]);): elemen terakhir ada di indeksukuran - 1=5 - 1 = 4. Indeks5atau lebih besar adalah out-of-bounds dan termasuk undefined behavior. - Baris 13 (
harga[2] = 9500;): menulis nilai baru ke elemen indeks2. Setelah baris ini,harga[2]berubah dari8000menjadi9500. - Baris 14 (
printf(...)): membaca kembali elemenharga[2]untuk memverifikasi perubahan sudah tersimpan. - Baris 17 (
int i = 3;): mendeklarasikan variabeliyang akan dipakai sebagai indeks. Mengakses via variabel membuat kode fleksibel—loopformemanfaatkan pola ini. - Baris 18 (
printf("Harga indeks %d: %d\n", i, harga[i]);): ekspresiharga[i]dievaluasi dengan membaca nilaii(3) lebih dulu, lalu mengakses elemen indeks3yaitu45000. - Baris 21 (
printf("Harga [4-2] = %d\n", harga[4 - 2]);): indeks boleh berupa ekspresi integer apa pun. Ekspresi4 - 2dievaluasi menjadi2, sehingga yang diakses adalahharga[2](nilai9500setelah perubahan di atas).
Akses Pertama, Terakhir, dan Pertukaran Elemen #
Dua pola yang sering muncul di algoritma: mengakses elemen pertama dan terakhir tanpa hardcode indeks, serta menukar dua elemen. Contoh berikut menunjukkan keduanya.
#include <stdio.h>
int main(void) {
int buah[5] = {12, 8, 15, 6, 10};
/* Akses elemen pertama dan terakhir tanpa hardcode indeks */
size_t n = sizeof(buah) / sizeof(buah[0]);
printf("Pertama: %d, Terakhir: %d\n", buah[0], buah[n - 1]);
/* Tukar dua elemen */
int tmp = buah[0];
buah[0] = buah[n - 1];
buah[n - 1] = tmp;
printf("Setelah tukar: %d %d\n", buah[0], buah[n - 1]);
/* Akses elemen via ekspresi */
int i = 2;
printf("buah[i+1] = %d\n", buah[i + 1]);
return 0;
}Output yang Dihasilkan:
Pertama: 12, Terakhir: 10
Setelah tukar: 10 12
buah[i+1] = 6Pada contoh di atas, ekspresi sizeof(buah) / sizeof(buah[0]) menghitung jumlah elemen secara otomatis. Elemen pertama selalu buah[0], elemen terakhir selalu buah[n - 1]. Pola pertukaran memakai variabel sementara tmp—ini wajib karena tanpa variabel perantara, salah satu nilai akan hilang saat ditimpa. Setelah pertukaran, buah[0] dan buah[4] saling bertukar nilai.