Array satu dimensi merepresentasikan deret nilai, tetapi banyak data di dunia nyata berbentuk tabel: papan catur, nilai ujian per siswa per mapel, piksel gambar, atau matriks pada matematika. Untuk kebutuhan itu C++ menyediakan array multidimensi — array yang elemennya juga array. Yang perlu digarisbawahi sejak awal: C++ tidak benar-benar punya “array 2D” sebagai entitas khusus; yang ada adalah array of array (array dari array), dan semua mekanismenya bisa dipahami dari array biasa yang sudah kita kuasai. Pada Chapter ini kita mendeklarasikan array dua dimensi, mengisinya dengan inisialisasi nested, menelusurinya dengan iterasi berlapis, lalu melihat bagaimana ia tersusun di memori.

Deklarasi dan Inisialisasi Nested #

Deklarasi int matriks[2][3]; berarti “array berisi 2 elemen, di mana setiap elemen adalah array int[3]”. Pembacaan yang tepat: 2 baris, masing-masing 3 kolom. Pengisiannya memakai initializer list bertingkat — setiap kurung kurawal dalam mengisi satu baris:

cpp
#include <iostream>

int main() {
    int matriks[2][3] = {
        {1, 2, 3},   // baris 0
        {4, 5, 6}    // baris 1
    };

    // iterasi nested: loop luar berkeliling baris, loop dalam berkeliling kolom
    for (int baris = 0; baris < 2; ++baris) {
        for (int kolom = 0; kolom < 3; ++kolom) {
            std::cout << (kolom > 0 ? " " : "") << matriks[baris][kolom];
        }
        std::cout << '\n';
    }

    // ukuran total dan ukuran satu baris dalam byte
    std::cout << "sizeof(matriks)    : " << sizeof(matriks) << " byte\n";
    std::cout << "sizeof(matriks[0]) : " << sizeof(matriks[0]) << " byte\n";

    // bukti row-major: baris 1 mulai tepat 3 elemen setelah baris 0
    std::cout << "jarak baris 0 ke baris 1: "
              << (&matriks[1][0] - &matriks[0][0]) << " elemen\n";

    return 0;
}

Output yang Dihasilkan:

text
1 2 3
4 5 6
sizeof(matriks)    : 24 byte
sizeof(matriks[0]) : 12 byte
jarak baris 0 ke baris 1: 3 elemen

Mari kita bedah:

  1. Baris 5-8 (initializer list nested): baris pertama {1, 2, 3} mengisi matriks[0], baris kedua {4, 5, 6} mengisi matriks[1]. Aturan inisialisasi dari Chapter Inisialisasi Array berlaku berlapis: kurung kurawal kosong pada level apa pun akan menol-kan sisanya.
  2. Baris 11-16 (iterasi nested): loop luar bergerak melintasi indeks baris (0..1), loop dalam melintasi indeks kolom (0..2). Akses matriks[baris][kolom] dibaca dari luar ke dalam: ambil baris ke-baris, lalu kolom ke-kolom di dalamnya.
  3. Baris 19-20 (sizeof): total memori adalah 24 byte (6 elemen × 4 byte), sedangkan satu baris matriks[0] berukuran 12 byte. Pola ini mengonfirmasi bahwa matriks adalah array berisi dua array int[3].
  4. Baris 23-24 (jarak antar baris): selisih alamat antara awal baris 0 dan awal baris 1 adalah 3 elemen. Baris pertama mulai tepat setelah baris terakhir selesai — bukti visual dari tata letak row-major yang kita bahas di bagian berikut.

Tata Letak Memori Row-Major #

Meskipun kita membayangkannya sebagai tabel dua dimensi, memori komputer tetap satu dimensi. Standar C++ menetapkan array multidimensi disimpan dalam pola row-major order: baris 0 ditulis penuh terlebih dahulu, disusul baris 1, dan seterusnya. Untuk int matriks[2][3], susunan memornya:

text
indeks logis : [0][0] [0][1] [0][2] | [1][0] [1][1] [1][2]
nilai        :    1      2      3   |    4      5      6
memori       : elemen keenam tersimpan berurutan tanpa celah

Konsekuensinya praktis dan penting. Akses matriks[baris][kolom] dihitung compiler dengan rumus awal + (baris * 3 + kolom) * sizeof(int) — tetap satu perhitungan aritmetika, sama cepatnya dengan array satu dimensi. Rumus itu juga menjelaskan mengapa hanya ukuran terdepan yang boleh kosong pada parameter fungsi (lihat Chapter Array sebagai Parameter Fungsi): tanpa mengetahui jumlah kolom, compiler tidak bisa menghitung posisi matriks[1][0].

Pola row-major juga memengaruhi performa penelusuran besar. Mengiterasi kolom di loop luar dan baris di loop dalam membuat lompatan memori yang jauh; urutan sebaliknya (baris luar, kolom dalam) menyusuri memori secara berurutan dan lebih ramah cache CPU. Topik cache locality dibedakan tuntas pada Section Performa dan Optimasi — untuk saat ini, jadikan “iterasi mengikuti urutan memori” sebagai kebiasaan baik.

Memperluas ke Dimensi Lebih Banyak #

Sintaks yang sama berlanjut ke dimensi ketiga dan seterusnya. int kubus[2][3][4]; adalah array berisi 2 matriks, yang masing-masing berukuran 3×4 — total 24 elemen. Inisialisasinya menambah satu tingkat kurung kurawal lagi, dan penelusurannya menambah satu loop lagi per dimensi. Dalam praktik industri, array tiga dimensi ke atas jarang ditulis sebagai array C-style karena sulit dikelola; data volumetrik biasanya disimpan sebagai satu array panjang dengan penghitungan indeks manual, atau memakai container dari pustaka.

Pada Chapter berikutnya array kita mulai bepergian: dikirim ke fungsi sebagai parameter. Di sanalah kelemahan besar array C-style — hilangnya informasi ukuran — terlihat nyata untuk pertama kalinya.

Rujukan resmi: cppreference — Array declaration (multidimensional arrays) .