Ketika kita perlu menyimpan satu nilai, sebuah variabel tunggal sudah cukup. Namun banyak masalah nyata melibatkan koleksi data yang sejenis: daftar nilai ujian 30 siswa, harga 7 hari dalam seminggu, atau koordinat 100 titik pada peta. Menyimpan setiap nilai di variabel terpisah seperti nilai1, nilai2, nilai3, … akan membuat kode cepat tidak terkelola. Array menyediakan cara untuk menampung sejumlah nilai bertipe sama di bawah satu nama, dengan setiap elemen diidentifikasi melalui indeks numerik. Pada chapter ini kita akan menelusuri ide dasar array, mengapa array menempati memori berurutan, dan bagaimana array mempermudah pemrosesan data berkelompok.

Apa Itu Array #

Array adalah kumpulan elemen bertipe sama yang dialokasikan dalam satu blok memori berurutan. Setiap elemen memiliki indeks integer yang dimulai dari 0. Karena elemen-elemen array menempati alamat memori yang berdekatan dan terurut, kita bisa mengakses elemen mana pun dalam waktu konstan (O(1)) hanya dengan indeks—compiler menghitung alamat elemen melalui rumus alamat_awal + indeks * sizeof(elemen).

Tiga sifat penting array di C:

  1. Homogen — semua elemen bertipe sama (misalnya semua int atau semua double).
  2. Berukuran tetap — ukuran array ditentukan saat deklarasi dan tidak bisa diubah saat runtime (kecuali menggunakan VLA yang akan kita bahas terpisah).
  3. Berurutan di memori — jarak alamat antara arr[i] dan arr[i+1] tepat sizeof(elemen) byte.

Visualisasi Konsep #

Diagram berikut memperlihatkan array int nilai[5] sebagai lima sel memori berurutan, masing-masing berisi nilai dan diidentifikasi oleh indeks:

Pada diagram di atas, lima elemen array nilai menempati alamat memori berurutan dengan jarak tepat sizeof(int) = 4 byte. Indeks 0..4 mengidentifikasi posisi setiap elemen. Karena elemen tersusun rapat, compiler dapat menghitung alamat elemen mana pun dalam waktu konstan melalui rumus &nilai[0] + indeks * sizeof(int)—inilah mengapa akses array nilai[i] berjalan dalam O(1) terlepas dari nilai i. Sifat berurutan ini juga menjadi dasar pointer arithmetic: nilai + i otomatis menggeser alamat maju i * sizeof(int) byte.

Contoh Penggunaan Array #

Kita mulai dengan kasus klasik: menyimpan nilai ujian lima siswa lalu menghitung rata-rata. Tanpa array, kita membutuhkan lima variabel terpisah. Dengan array, satu nama nilai menampung kelima nilai tersebut.

c
#include <stdio.h>

int main(void) {
    /* Array satu dimensi berisi 5 nilai ujian */
    int nilai[5] = {78, 85, 90, 67, 92};

    printf("Daftar nilai ujian:\n");
    for (int i = 0; i < 5; i++) {
        printf("  Siswa %d: %d\n", i, nilai[i]);
    }

    /* Hitung rata-rata */
    int total = 0;
    for (int i = 0; i < 5; i++) {
        total += nilai[i];
    }
    printf("Rata-rata: %.2f\n", total / 5.0);

    return 0;
}

Output yang Dihasilkan:

text
Daftar nilai ujian:
  Siswa 0: 78
  Siswa 1: 85
  Siswa 2: 90
  Siswa 3: 67
  Siswa 4: 92
Rata-rata: 82.40

Mari kita telaah baris-baris kode di atas:

  1. Baris 4 (int nilai[5] = {78, 85, 90, 67, 92};): deklarasi array nilai dengan tipe int, kapasitas 5 elemen, sekaligus inisialisasi. Angka [5] menyatakan ukuran; tanda kurung kurawal {...} mengapit daftar nilai awal.
  2. Baris 6 (for (int i = 0; i < 5; i++)): loop mengiterasi indeks 0 sampai 4. Indeks terakhir selalu ukuran - 1.
  3. Baris 7 (printf(" Siswa %d: %d\n", i, nilai[i]);): mengakses elemen ke-i melalui ekspresi nilai[i]. Ekspresi ini membaca nilai pada alamat &nilai[0] + i * sizeof(int).
  4. Baris 11-12 (total += nilai[i];): akumulator penjumlahan. Setiap iterasi menambahkan elemen array ke variabel total.
  5. Baris 13 (printf(...)): rata-rata dihitung dengan membagi total (int) oleh 5.0 (double). Konversi otomatis ke double terjadi karena salah satu operand bertipe double, sehingga hasil pembagian bukan pembagian integer.

Array dengan Tipe Data Lain #

Array tidak terbatas pada int. Kita bisa membuat array double, char, atau tipe lain. Contoh berikut menyimpan suhu harian dalam array double dan daftar huruf vokal dalam array char.

c
#include <stdio.h>

int main(void) {
    /* Array double untuk menyimpan suhu */
    double suhu[7] = {27.5, 28.0, 29.2, 26.8, 30.1, 28.9, 27.7};
    double total = 0.0;

    for (int i = 0; i < 7; i++) {
        total += suhu[i];
    }
    printf("Suhu rata-rata mingguan: %.2f C\n", total / 7.0);

    /* Array char sebagai buffer */
    char vokal[5] = {'a', 'i', 'u', 'e', 'o'};
    printf("Vokal: ");
    for (int i = 0; i < 5; i++) {
        printf("%c ", vokal[i]);
    }
    printf("\n");

    return 0;
}

Output yang Dihasilkan:

text
Suhu rata-rata mingguan: 28.31 C
Vokal: a i u e o

Pada contoh di atas, array suhu menampung tujuh nilai bertipe double, sedangkan vokal menampung lima karakter. Loop for mengakses setiap elemen dengan pola yang sama: inisialisasi indeks 0, kondisi i < ukuran, dan inkremen i++. Pola ini begitu umum sehingga akan kita temui hampir di setiap kode yang memanfaatkan array.

Mengapa Array Penting #

Array menyatukan koleksi data sehingga kita bisa memproses seluruh elemen dengan satu loop tanpa menulis ulang kode per elemen. Bayangkan mengelola 100 nilai ujian tanpa array—kita akan membutuhkan 100 variabel dan 100 perintah baca/tulis. Dengan array, satu loop for cukup untuk membaca, menjumlahkan, mencari maksimum, atau mengurutkan seluruh data. Array juga merupakan fondasi untuk struktur data lain seperti string (yang pada dasarnya adalah array char), matriks (array 2D), dan buffer I/O. Pada chapter-chapter berikutnya kita akan menelusuri detail deklarasi, inisialisasi, akses elemen, dan iterasi array secara lebih mendalam.