Sebuah struct di C melibatkan dua langkah konseptual yang sering dicampuradukkan oleh pemula: pertama, mendefinisikan tata letak tipe struct (member apa saja dan urutannya); kedua, mendeklarasikan variabel bertipe struct tersebut. Kedua langkah bisa digabung dalam satu pernyataan atau dipisah. Pemahaman perbedaan ini penting karena banyak error pemula berakar dari kebingungan antara nama tipe dan nama variabel. Pada chapter ini kita akan menelusuri tiga bentuk deklarasi struct yang umum dipakai: deklarasi dengan tag, deklarasi dengan inisialisasi, dan deklarasi variabel sekaligus saat pendefinisian tipe.
Anatomi Deklarasi struct #
Bentuk umum pendefinisian struct adalah sebagai berikut:
struct <tag> {
<tipe_member_1> <nama_member_1>;
<tipe_member_2> <nama_member_2>;
/* ... */
} <daftar_variabel_opsional>;Bagian struct <tag> { ... } adalah definisi tipe. Bagian <daftar_variabel_opsional> di akhir (sebelum titik koma) mendeklarasikan variabel bertipe struct tersebut. Jika kita hanya ingin mendefinisikan tipe tanpa langsung membuat variabel, bagian akhir tersebut bisa dikosongkan—tetapi titik koma penutup tetap wajib.
Tag struct (<tag>) adalah nama tipe yang kita berikan. Setelah pendefinisian, untuk mendeklarasikan variabel baru kita menulis struct <tag> nama_variabel;—kata kunci struct wajib diulang karena tag bukanlah tipe mandiri (kecuali setelah dipakai dengan typedef, yang akan kita bahas di chapter tersendiri).
Tiga Pola Deklarasi struct #
Kita akan melihat tiga pola umum yang sering muncul di kode nyata. Pertama, deklarasi biasa dengan tag. Kedua, deklarasi dengan inisialisasi aggregate ({...}) yang mengisi member sesuai urutan. Ketiga, designated initializer (C99) yang menyebut nama member, sehingga urutan penulisan boleh berbeda dari urutan deklarasi.
#include <stdio.h>
#include <string.h>
/* Pendefinisian struct dengan tag "Buku" */
struct Buku {
char judul[60];
char penulis[40];
int tahun;
float harga;
};
int main(void) {
/* Cara 1: deklarasi biasa dengan tag */
struct Buku b1;
strcpy(b1.judul, "Belajar C");
strcpy(b1.penulis, "Budi");
b1.tahun = 2024;
b1.harga = 99000.0f;
/* Cara 2: deklarasi dengan inisialisasi aggregate */
struct Buku b2 = {"Algoritma", "Siti", 2022, 125000.0f};
/* Cara 3: designator (C99) - menyebut nama member */
struct Buku b3 = {.judul = "Sistem Operasi",
.tahun = 2023,
.harga = 78000.0f,
.penulis = "Andi"};
printf("Buku 1: %s (%s, %d) - Rp%.0f\n",
b1.judul, b1.penulis, b1.tahun, b1.harga);
printf("Buku 2: %s (%s, %d) - Rp%.0f\n",
b2.judul, b2.penulis, b2.tahun, b2.harga);
printf("Buku 3: %s (%s, %d) - Rp%.0f\n",
b3.judul, b3.penulis, b3.tahun, b3.harga);
return 0;
}Output yang Dihasilkan:
Buku 1: Belajar C (Budi, 2024) - Rp99000
Buku 2: Algoritma (Siti, 2022) - Rp125000
Buku 3: Sistem Operasi (Andi, 2023) - Rp78000Mari kita telaah baris-baris kode di atas:
- Baris 5-10 (
struct Buku { ... };): definisi tipestruct Bukudengan empat member. TagBukuadalah nama tipe; sejak titik ini kita bisa mendeklarasikan variabelstruct Buku .... - Baris 13-18 (
struct Buku b1; ... b1.harga = 99000.0f;): variabelb1dideklarasikan dulu, lalu setiap member diisi satu per satu. Untuk memberchar[]kita pakaistrcpykarena array tidak bisa di-assign. - Baris 21 (
struct Buku b2 = {"Algoritma", "Siti", 2022, 125000.0f};): aggregate initializer. Nilai dalam kurung kurawal dipetakan ke member sesuai urutan deklarasi:judul,penulis,tahun,harga. - Baris 24-27 (
struct Buku b3 = {.judul = ...};): designated initializer (didukung sejak C99). Kita menyebut nama member lewat.nama_member = nilai. Karena nama disebut eksplisit, urutan penulisan boleh berbeda dari urutan deklarasi—tahunditulis sebelumpenulistanpa masalah. - Baris 29-33 (
printf(...)): mencetak keempat member dengan format yang konsisten.
Deklarasi Variabel Saat Pendefinisian #
C memungkinkan kita mendeklarasikan variabel langsung setelah definisi tipe. Pola ini sering muncul ketika kita hanya membutuhkan satu variabel dan tidak ingin nama tipe dipakai di tempat lain. Kita bahkan bisa mendefinisikan struct tanpa tag—disebut anonymous struct—yang hanya bisa dipakai untuk variabel yang dideklarasikan saat itu juga.
#include <stdio.h>
/* Definisi struct tanpa tag (anonymous struct) */
struct {
int x;
int y;
} titik_a, titik_b; /* Deklarasi variabel sekaligus */
/* Definisi struct dengan tag dan variabel */
struct Warna {
int r, g, b;
} merah = {255, 0, 0};
int main(void) {
titik_a.x = 5;
titik_a.y = 10;
titik_b.x = 20;
titik_b.y = 25;
printf("titik_a = (%d, %d)\n", titik_a.x, titik_a.y);
printf("titik_b = (%d, %d)\n", titik_b.x, titik_b.y);
printf("merah = RGB(%d, %d, %d)\n", merah.r, merah.g, merah.b);
return 0;
}Output yang Dihasilkan:
titik_a = (5, 10)
titik_b = (20, 25)
merah = RGB(255, 0, 0)Pada contoh di atas, struct { int x; int y; } titik_a, titik_b; mendefinisikan struct anonim sekaligus mendeklarasikan dua variabel titik_a dan titik_b. Karena tidak ada tag, kita tidak bisa membuat variabel ketiga bertipe sama di tempat lain. Untuk struct Warna, tag diberikan dan variabel merah sekaligus diinisialisasi dengan {255, 0, 0}.