Mendeklarasikan array hanya memesan ruang memori; nilai yang ada di dalamnya belum tentu nol. Inisialisasi memberi nilai awal yang pasti sehingga program berperilaku deterministik. C menyediakan beberapa pola inisialisasi: inisialisasi penuh, inisialisasi sebagian (sisanya otomatis nol), inisialisasi dengan ukuran otomatis dari jumlah elemen, hingga designated initializer yang diperkenalkan di C99 untuk menandai elemen tertentu berdasarkan indeks. Pada chapter ini kita akan menelusuri kelima pola tersebut beserta kebiasaan praktis yang membuat kode lebih ringkas dan aman.
Lima Pola Inisialisasi #
Lima pola inisialisasi array yang umum dijumpai:
- Inisialisasi penuh — semua elemen diisi; ukuran array ditulis eksplisit.
- Inisialisasi sebagian — hanya sebagian elemen diisi; sisanya otomatis bernilai
0. - Inisialisasi nol sepenuhnya — idiom
int arr[N] = {0};meng-nol-kan seluruh elemen. - Ukuran otomatis — tanda
[]kosong, ukuran ditentukan dari jumlah elemen initializer. - Designated initializer (C99) — menandai indeks tertentu dengan
[i] = nilai.
Contoh berikut memperlihatkan kelima pola tersebut dalam satu program.
#include <stdio.h>
int main(void) {
/* Inisialisasi penuh */
int a[5] = {10, 20, 30, 40, 50};
/* Inisialisasi sebagian: sisanya otomatis 0 */
int b[5] = {7, 8};
/* Inisialisasi nol sepenuhnya */
int c[5] = {0};
/* Ukuran ditentukan otomatis dari jumlah elemen */
int d[] = {100, 200, 300, 400};
/* Designated initializer (C99) */
int e[5] = {[2] = 99, [4] = 88};
printf("a = %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
printf("b = %d %d %d %d %d\n", b[0], b[1], b[2], b[3], b[4]);
printf("c = %d %d %d %d %d\n", c[0], c[1], c[2], c[3], c[4]);
printf("d = %d %d %d %d\n", d[0], d[1], d[2], d[3]);
printf("e = %d %d %d %d %d\n", e[0], e[1], e[2], e[3], e[4]);
return 0;
}Output yang Dihasilkan:
a = 10 20 30 40 50
b = 7 8 0 0 0
c = 0 0 0 0 0
d = 100 200 300 400
e = 0 0 99 0 88Mari kita telaah baris-baris kode di atas:
- Baris 4 (
int a[5] = {10, 20, 30, 40, 50};): inisialisasi penuh. Lima nilai dipetakan ke indeks0..4secara berurutan. Ukuran array (5) cocok dengan jumlah elemen initializer. - Baris 7 (
int b[5] = {7, 8};): inisialisasi sebagian. Elemenb[0] = 7,b[1] = 8; elemenb[2],b[3],b[4]otomatis bernilai0karena aturan standar C: bila initializer lebih pendek dari ukuran array, elemen sisanya di-zero-initialize. - Baris 10 (
int c[5] = {0};): idiom yang sangat umum. Hanya elemen pertama yang eksplisit diisi0, tetapi karena aturan inisialisasi sebagian di atas, semua elemen sisanya juga menjadi0. Hasilnya: seluruh elemen bernilai0. - Baris 13 (
int d[] = {...}): ukuran tidak ditulis; compiler menghitung jumlah elemen initializer (4) dan menjadikan ukuran array4. Ini berguna saat kita ingin menambah atau menghapus elemen tanpa mengubah angka ukuran. - Baris 16 (
int e[5] = {[2] = 99, [4] = 88};): designated initializer dari C99. Elemen indeks2diisi99, indeks4diisi88. Elemen lain yang tidak disebutkan otomatis bernilai0. Ini berguna bila kita ingin menandai beberapa elemen tertentu sementara sisanya tetap nol.
Inisialisasi Array 2D dan Array char sebagai String #
Pola inisialisasi yang sama berlaku untuk array berdimensi lebih tinggi. Untuk array 2D, kita bisa memakai nested braces agar kode lebih terbaca. Untuk array char yang merepresentasikan string, kita bisa langsung memberi string literal yang akan diakhiri karakter nol ('\0') secara otomatis.
#include <stdio.h>
int main(void) {
/* Inisialisasi array char sebagai string */
char pesan[] = "Halo C!"; /* otomatis berukuran 8 (termasuk '\0') */
printf("Pesan: %s\n", pesan);
printf("sizeof(pesan) = %zu\n", sizeof(pesan));
/* Inisialisasi array 2D dengan nested braces */
int m[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
printf("m[1][2] = %d\n", m[1][2]);
/* Inisialisasi 2D sebagian - sisanya nol */
int grid[3][3] = {
{1, 2},
{3}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", grid[i][j]);
}
printf("\n");
}
return 0;
}Output yang Dihasilkan:
Pesan: Halo C!
sizeof(pesan) = 8
m[1][2] = 6
1 2 0
3 0 0
0 0 0Pada contoh di atas, array pesan berukuran 8 byte—tujuh karakter tampak (H, a, l, o, , C, !) ditambah satu byte terminator '\0' yang otomatis ditambahkan compiler. Inisialisasi 2D dengan nested braces mempermudah pembacaan baris per baris; bila inner brace lebih pendek dari jumlah kolom, sisanya otomatis bernilai 0—terlihat pada grid yang baris ke-3 ({0, 0, 0}) tidak disebut sama sekali sehingga seluruh elemennya bernilai 0.
Ringkasan Pola Inisialisasi #
| Pola | Sintaks | Efek |
|---|---|---|
| Penuh | int a[3] = {1, 2, 3}; | semua elemen diisi |
| Sebagian | int b[5] = {1, 2}; | dua elemen diisi, tiga sisanya 0 |
| Nol total | int c[5] = {0}; | semua elemen 0 |
| Ukuran otomatis | int d[] = {1, 2, 3}; | ukuran = 3 |
| Designated (C99) | int e[5] = {[2] = 9}; | hanya indeks 2 berisi 9, lainnya 0 |
Memilih pola yang tepat membuat kode lebih ringkas dan ekspresif. Gunakan pola penuh bila semua elemen memang berbeda; gunakan {0} bila ingin array bernilai awal nol; gunakan designated initializer bila hanya beberapa elemen yang spesial.