Episode ini memperluas perbendaharaan tipe data C: array satu dan multi dimensi, string sebagai array karakter, struct, union, dan enum sebagai tipe komposit, serta typedef untuk alias yang memperjelas maksud kode dan struktur data sederhana.

Tipe data dasar hanya cukup untuk program sederhana. Aplikasi nyata membutuhkan kumpulan nilai dan struktur yang lebih kompleks. Episode 6 membahas array untuk menyimpan banyak nilai, string yang merupakan array karakter, serta struct, union, dan enum untuk memodelkan data dunia nyata.
Konsep kunci yang harus dipahami: di C, array adalah blok memori berurutan, dan nama array adalah pointer ke elemen pertama. Pemahaman ini akan menjadi jembatan menuju pointer di episode 7 dan struktur data di episode 9.
Dengan tipe komposit, kalian bisa memodelkan entitas seperti mahasiswa, produk, atau paket jaringan dalam satu jenis data yang jelas. Inilah cara C membangun sistem besar dari bata-bata kecil.
Array menyimpan banyak nilai bertipe sama dalam satu blok memori berurutan. Deklarasi int nilai[5] membuat array berisi 5 int, dengan indeks dari 0 sampai 4:
cat > array.c <<'EOF'
#include <stdio.h>
int main(void) {
int nilai[5] = {80, 90, 75, 88, 92};
int total = 0;
for (int i = 0; i < 5; i++) {
total += nilai[i];
}
printf("Rata-rata: %d\n", total / 5);
return 0;
}
EOF
gcc -Wall -Wextra array.c -o array && ./arrayInisialisasi int nilai[5] = {80, 90, 75, 88, 92} mengisi array secara langsung. Elemen diakses dengan indeks, misalnya nilai[0] untuk nilai pertama. Melampaui batas array tidak dicegah compiler — inilah sumber utama bug dan topik penting episode 13.
Array dua dimensi adalah array dari array, seperti tabel dengan baris dan kolom:
int matriks[2][3] = {
{1, 2, 3},
{4, 5, 6},
};
for (int baris = 0; baris < 2; baris++) {
for (int kolom = 0; kolom < 3; kolom++) {
printf("%d ", matriks[baris][kolom]);
}
printf("\n");
}Akses matriks[baris][kolom] memakai dua indeks: baris dulu, kolom berikutnya. Dalam memori, elemen tersimpan baris per baris secara berurutan, sebuah fakta yang berpengaruh pada cache performance di episode 15.
Di C, string adalah array char yang diakhiri karakter nol '\0'. Fungsi library seperti strlen dan strcpy bekerja dengan menghitung hingga menemukan karakter nol ini:
cat > string.c <<'EOF'
#include <stdio.h>
#include <string.h>
int main(void) {
char nama[32] = "Belajar C";
printf("Panjang: %zu\n", strlen(nama));
strcat(nama, " Language");
printf("%s\n", nama);
return 0;
}
EOF
gcc -Wall -Wextra string.c -o string && ./stringstrlen(nama) menghitung karakter hingga nol, sedangkan strcat menggabungkan string kedua ke akhir string pertama. Buffer nama[32] harus cukup besar menampung hasil gabungan; jika tidak, terjadi overflow yang akan dibahas di episode 13.
String literal seperti "halo" diletakkan di segmen read-only. Ubah isi literal memakai pointer akan menyebabkan crash. Gunakan array char[] jika ingin mengubah isinya. Pahami perbedaan char *p = "halo" yang menunjuk data read-only, dan char p[] = "halo" yang menyalin literal ke array lokal.
Struct mengelompokkan beberapa nilai bertipe berbeda menjadi satu entitas. Contoh memodelkan data mahasiswa:
cat > struktur_data.c <<'EOF'
#include <stdio.h>
enum Semester { GANJIL = 1, GENAP = 2 };
struct Mahasiswa {
char nama[32];
int angkatan;
enum Semester semester;
};
int main(void) {
struct Mahasiswa mhs = {"Arman", 2024, GANJIL};
printf("%s angkatan %d\n", mhs.nama, mhs.angkatan);
return 0;
}
EOF
gcc -Wall -Wextra struktur_data.c -o struktur_data && ./struktur_dataAkses anggota struct memakai operator titik: mhs.nama dan mhs.angkatan. Struct bisa berisi tipe dasar, array, bahkan struct lain. Enum di atas memberi nama untuk nilai konstan yang berurutan.
Union menyimpan beberapa anggota pada alamat memori yang sama. Ukurannya adalah ukuran anggota terbesar, dan hanya satu anggota yang bermakna pada satu waktu. Union berguna untuk memodelkan data yang bisa menjadi beberapa tipe berbeda, misalnya pesan protokol yang tipe-nya ditentukan di runtime.
Enum mendefinisikan sekumpulan konstanta bernama yang otomatis bernilai 0, 1, 2, dan seterusnya, atau bisa diatur eksplisit. Memakai enum membuat kode lebih terbaca daripada angka ajaib. Kompiler juga bisa memperingatkan switch yang tidak menangani semua anggota enum.
Keyword typedef membuat alias untuk tipe yang sudah ada, memendekkan penulisan dan memperjelas maksud:
typedef unsigned long size_byte;
typedef struct Mahasiswa Mahasiswa;Setelah typedef struct Mahasiswa Mahasiswa;, kalian bisa menulis Mahasiswa m; tanpa kata kunci struct. Alias seperti size_byte juga menyembunyikan detail tipe sehingga mudah diubah di satu tempat.
Dengan kombinasi struct, array, dan pointer, kalian bisa membangun struktur data dasar. Contoh sederhana adalah array struct yang menyimpan beberapa mahasiswa dan diurutkan berdasarkan angkatan. Pointer berperan penting untuk struktur dinamis seperti linked list — topik yang akan dibahas mendalam di episode 9.
Tip
Saat struct berisi array, menyalin struct dengan operator penugasan akan menyalin seluruh isi array juga. Untuk objek besar, lebih efisien melewati pointer ke struct dibanding menyalin struct utuh berulang kali.
Inti yang harus dibawa pulang:
Di episode 7 selanjutnya kita akan membahas pointer dan memory management — dasar pointer, dereference, dan alamat memori, pointer terhadap array, string, dan fungsi, dynamic memory allocation dengan malloc, calloc, realloc, dan free, hingga pointer safety dan bug umum seperti use-after-free.