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:

  1. Membaca — x = arr[i];
  2. Menulis — arr[i] = x;
  3. Menggabungkan dengan operasi — arr[i] += 5; (setara arr[i] = arr[i] + 5;)
  4. 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.

c
#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:

text
Harga pertama : 15000
Harga terakhir : 12000
Harga setelah diubah: 9500
Harga indeks 3: 45000
Harga [4-2] = 9500

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (int harga[5] = {15000, 22500, 8000, 45000, 12000};): deklarasi array harga dengan 5 elemen. Elemen harga[0] = 15000, harga[1] = 22500, …, harga[4] = 12000.
  2. Baris 7 (printf("Harga pertama : %d\n", harga[0]);): membaca elemen pertama dengan indeks 0. Operator [] membaca nilai pada alamat &harga[0] + 0 * sizeof(int).
  3. Baris 10 (printf("Harga terakhir : %d\n", harga[4]);): elemen terakhir ada di indeks ukuran - 1 = 5 - 1 = 4. Indeks 5 atau lebih besar adalah out-of-bounds dan termasuk undefined behavior.
  4. Baris 13 (harga[2] = 9500;): menulis nilai baru ke elemen indeks 2. Setelah baris ini, harga[2] berubah dari 8000 menjadi 9500.
  5. Baris 14 (printf(...)): membaca kembali elemen harga[2] untuk memverifikasi perubahan sudah tersimpan.
  6. Baris 17 (int i = 3;): mendeklarasikan variabel i yang akan dipakai sebagai indeks. Mengakses via variabel membuat kode fleksibel—loop for memanfaatkan pola ini.
  7. Baris 18 (printf("Harga indeks %d: %d\n", i, harga[i]);): ekspresi harga[i] dievaluasi dengan membaca nilai i (3) lebih dulu, lalu mengakses elemen indeks 3 yaitu 45000.
  8. Baris 21 (printf("Harga [4-2] = %d\n", harga[4 - 2]);): indeks boleh berupa ekspresi integer apa pun. Ekspresi 4 - 2 dievaluasi menjadi 2, sehingga yang diakses adalah harga[2] (nilai 9500 setelah 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.

c
#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:

text
Pertama: 12, Terakhir: 10
Setelah tukar: 10 12
buah[i+1] = 6

Pada 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.