Structures and Union and Memory Allocation
STRUCTURE
Struct adalah tipe data bentukan yang berisi kumpulan variabel-variabel yang berada dalam satu nama yang sama dan memiliki kaitan satu sama lain. Berbeda dengan array hanya berupa kumpulan variabel yang bertipe data sama, struct bisa memiliki variabel-variabel yang bertipe data sama atau berbeda, bahkan bisa menyimpan variabel yang bertipe data array atau struct itu sendiri. Variabel-variabel yang menjadi anggota struct disebut dengan elemen struct.
Dari perbedaan array dan struct diatas, kita dapat mengambil contoh :
Array namaSiswa[]={“budi”, “toni”, “andi”, “ani”, “sinta”};
Struct Siswa {
int noabsen;
char nama[100];
int nilai;
}
Array hanya menyimpan data dengan tipe data yang sama. Sedangkan struct bisa juga dikatakan sebagai tipe data baru yang dapat menampung berbagai tipe data lain yang berbeda.
http://images.flatworldknowledge.com/carpenter/carpenter-fig07_001.jpg
#include<stdio.h>
structmanusia {
charnama[100];
intumur;
};
structsiswa {
charkelas[20];
intno_absen;
structmanusia orang;
};
intmain(void){
structsiswa hery ={"XII TKJ 2",5,{"Hery Vandoro",21}};
printf("Nama Siswa : %s\n",hery.orang.nama);
printf("Umur : %d\n",hery.orang.umur);
printf("Kelas : %s\n",hery.kelas);
printf("No Absen : %d\n",hery.no_absen);
getchar();
return0;
}
Contoh diatas adalah cara pendeklarasian dan penggunaan struct dasar. Berdasarkan contoh di atas, kita dapat menggunakan data struct yang telah dideklarasikan dengan melakukan deklarasi lengkap di bagian fungsi “main” (struct siswa hery;) .
o Penggunaan/pemakaian tipe data struct dilakukan dengan membuat suatu variabel yang bertipe data struct tersebut
o Pengaksesan elemen struct dilakukan secara individual dengan menyebutkan nama variabel struct diikuti dengan operator titik (.)
UNION DEFINITION
Union: untuk memberi beberapa nama untuk satu lokasi memori. Ini yang biasanya yang sulit dimengerti oleh yang baru belajar C. Saya berikan beberapa contoh:
#include <stdio.h>
union {
int a;
int b;
} a_dan_b;
int main()
{
a_dan_b.a = 5;
printf("%d\n", a_dan_b.b);
return 0;
}
|
Apa hasil keluaran program itu? Jawabnya adalah 5, karena a dan b menempati lokasi memori yang sama. Kita bisa menambahkan banyak variabel di union. Jika tipe variabel itu sama, maka nilainya akan sama. Kita bisa membuat union dari tipe yang berbeda juga, misalnya:
union {
int a;
char b;
long c;
double d;
} test;
|
Kompilator akan mengalokasikan memori sesuai dengan tipe yang paling besar (dalam contoh di atas adalah double, 8 byte). Jika kita akses:
test.a = 5;
|
Lalu kita akses test.d, maka akan keluar angka yang aneh. Hal ini terjadi karena representasi double dan int tidak sama di memori.
Lalu apa kegunaan fitur semacam ini? biasanya union digabung dengan struct jika struktur digunakan untuk menyimpan lebih dari satu jenis data, dan pada satu saat kita hanya akan menggunakan satu jenis data.
Misalnya kita punya struktur bentuk, yang bisa menyimpan lingkaran atau bujursangkar. LIngkaran punya radius yang tipenya float sedangkan bujursangkar hanya integer (ini hanya contoh saja, sebenarnya agak mengada-ada supaya contohnya sederhana).Kita definisikan enumerasi seperti ini:
typedef enum { lingkaran, bujursangkar} jenisbentuk;
|
Dan struktur bentuk adalah seperti ini:
typedef struct {
jenisbentuk jenis;
union {
float radius;
int sisi;
} info;
} bentuk;
|
Kita bisa membuatnya tanpa union seperti ini:
typedef struct {
jenisbentuk jenis;
float radius;
int sisi;
} bentuk;
|
Tapi ini akan memakan lebih banyak memori (12 byte, sedangkan versi union hanya butuh 8 byte). Kita bisa menaruh informasi sisi dan radius di memori yang sama karena kita tahu, bahwa pada satu saat, hanya sisi ATAU radius saja yang dipakai.
Contoh pemakaiannya:
bentuk b;
if (bentuk_baru == lingkaran) {
b.jenis = lingkaran;
b.info.radius = r;
} else if (bentuk_baru == bujursangkar) {
b.jenis = bujursangkar;
b.info.sisi = s;
} else {
//bla bla, mungkin error
}
|
Untuk mengakses lagi, kita harus tahu apakah tadi kita menyimpan di sisi atau radius:
if (b.jenis==lingkaran) {
printf("Radius = %f\n", b.info.radius);
}
|
Teknik semacam ini banyak digunakan di banyak API/system call UNIX (contoh: API untuk socket yang bisa menangani berbagai jenis socket, baik tcp/ip. unix socket, bluetooth, dll). Banyak juga dipakai di teknik kompilasi (misal satu node identifier bisa berupa integer, float, atau yang lain).
ENUMERATION
Enumerasi suatu tipe data yang mempunyai elemen-elemen bernilai konstatnta dengan urutan yang sudah tertentu.Nilai-nilai tersebut berupa nilai integer. Nama enumerasi boleh tidak ditulis jika tidak digunakan untuk enumerasi lain.
Deklarasi
enum Nama_tipe { elemen1,elemen2,…};
Contoh : enum {Minggu, senin,selasa, rabu, kamis,jumat,sabtu}; printf(“%d%d%d%d%d%d”,minggu,senin,selasa,rabu,kamis,jumat,sabtu);
Output : 0123456
Inialisasi
enum {Minggu, senin,selasa =10, rabu, kamis,jumat =23,sabtu};
printf(“%d %d %d %d %d”,minggu,senin,selasa,rabu,kamis,jumat);
output : 0 1 10 11 12 23
Deklarasi variabel enum : Nama_tipe nama_variabel ;
Contoh :
#include <stdio.h>
main () { enum nama_hari //deklarasi enum
{senin,selasa,rabu,kamis,jumat,sabtu} hari1,hari2 ;
hari1= senin; hari2 = jumat; printf( selisih hari = %d”, hari2-hari1); }
output : selisih hari = 4
ket : hasil didapat dari jumat – senin = 4 – 0 = 4
hari1 dan hari2 adalah variable bertipe enum
bila didefinisikan terpisah dengan deklarasi enum maka ditulis menjadi
nama_hari hari1, hari2;
Comments
Post a Comment