Friday, May 27, 2005

MEMORI DINAMIS & POINTER

ALOKASI MEMORI DINAMIS DAN POINTER
Pendahuluan
Salah satu kelemahan data bertipe array adalah bahwa variabel tersebut harus dideklarasikan terlebih dahulu dengan menyebutkan ukurannya. Dengan demikian ukuran variabel tersebut tidak dapat kita ubah selama program dijalankan. Lalu bagaimanakah kalau kita akan membuat program untuk menangani data dalam jumlah yang besar? Bagaimana pula kalau jumlah datanya tidak diketahui sebelumnya?. Pertanyaan pertama mungkin dapat diselesaikan dengan memesan variabel array dengan ukuran sebanyak data yang akan dimasukkan. Tetapi sebenarnya ide ini belum tentu dapat dijalankan (terutama kalau implementasi programnya menggunakan bahasa yang mensyaratkan ukuran maksimum variabel dalam suatu program, seperti Pascal yang membatasi jumlah ukuran semua variabel dalam suatu program tidak boleh melebihi 64 Kb). Sebagai contoh, berikut ini adalah deklarasi dalam Pascal yang akan ditolak:
var banyak : array[1..35000] of integer;
var larikan : array[1..12000] of real;
var larik1 : array[1..30000] of char;
var larik2 : array[1..35000] of byte Pendeklarasian di atas akan ditolak oleh Pascal karena:
ukuran variabel banyak adalah 35000 x 2 byte = 70000 byte
ukuran variabel larikan adalah 12000 x 6 byte = 72000 byte
ukuran variabel larik1 = 30000 x 1 byte = 30000 byte dan ukuran variabel larik2= 35000 x 1 byte = 35000 byte, sehingga total ukuran kedua variabel adalah 65000 byte Permasalahan kedua juga menyulitkan pemrograman. Bila kita alokasikan variabel dengan ukuran yang besar sementara nantinya data yang dipakai hanya sedikit maka ini berarti pemborosan memori (memori sudah dipesan tetapi tidak dipergunakan) sedang bila dialokasikan dengan ukuran kecil sementara nantinya data yang digunakan cukup banyak sehingga deklarasi yang dibuat tidak cukup maka tentunya permasalahan tidak akan terselesaikan. Untuk mengatasi permasalahan di atas maka pada beberapa bahasa pemrograman terstruktur diperkenalkan adanya dua jenis variabel yaitu variabel statis (seperti yang sudah dibicarakan pada bagian sebelumnya) dan variabel dinamis yang akan kita bicarakan pada bagian ini.
ke atas halaman Alokasi Memori Dinamis Alokasi memori dinamis dapat dikatakan merupakan suatu teknik alokasi memori dimana, tidak seperti pada penggunaan array,penggunaan memori tidak sekaligus pada saat variabel dideklarasikan (dipesan) tetapi dengan bertahap. Program berjalan pada awalnya dengan sedikit memori data, kemudian pada suatu saat bila memerlukan ruang/memori lagi (misal datanya bertambah) barulah program meminta memori yang diperlukan untuk keperluan tersebut kepada sistem.Dengan cara yang sama bila program sudah tidak memerlukan data lagi maka memori yang diperlukan untuk menyimpan data dapat dibebaskan. Memori yang dibebaskan ini selanjutnya mungkin untuk proses yang lain (pada multiprogramming) atau untuk keperluan program yang sama nantinya. ke atas halaman
Pointer Pointer sering disebut juga dengan istilah link atau referensi adalah suatu variabel yang berisi alamat dari suatu variabel yang lain. Sebagai contohnya pada saat kita mengakses record kita tidak tahu dimana record tersebut secara eksak diletakkan di dalam memori, karena dengan menggunakan pointer kita membiarkan sistem komputer mengatur letak record tersebut ketika diperlukan. Secara umum, dalam pembicaraan tentang pointer, tipe data pointer digambarkan sebagai tanda panah sedang variabel yang ditunjuk digambarkan sebagai kotak.
Variabel Statis dan Variabel DinamisVariabel statis adalah variabel yang dideklarasikan dan dinamai pada saat penulisan program. Memori yang dipakai oleh variabel ini akan tetap ada (dianggap terpakai) selama program dimana variabel tersebut dideklarasikan sedang dijalankan. Variabel dinamis adalah variabel yang dibuat (dan mungkin juga dihapus/dirusak) selama eksekusi progam. Karena variabel dinamis belum nyata ada pada saat program dikompilasi (ia nyata-nyata ada pada saat dibuat yaitu pada saat program dieksekusi), maka variabel seperti ini tidak dapat dinamai pada saat program dibuat/ditulis. Satu-satunya cara untuk mengakses variabel dinamis adalah dengan menggunakan pointer. Saat suatu variabel dinamis dibuat, ia belum berisi data dan harus memiliki suatu tipe tertentu seperti halnya variabel biasa. Sebaliknya variabel statis tidak dapat dibuat ataupun dihapus pada saat eksekusi program dan variabel pointer tidak dapat digunakan untuk menunjuk kepada variabel statis. Variabel statis dapat diakses hanya dengan menggunakan namanya dan bila kita ingin menunjuk pada suatu posisi dalam array maka kita dapat melakukannya dengan menggunakan indeks/variabel yang bertipe seperti indeks dari array.
ke atas halaman
Notasi dalam Pascal Pointer dalam Pascal dinyatakan dengan menggunakan tanda "^". Sintaks secara umum adalah :type nama_pointer = ^tipe_variabel_yang_ditunjuk atauvar nama_pointer = ^tipe_variabel_yang_ditunjuk Keterangan:
nama_pointer adalah pengenal untuk tipe data pointer
tipe_variabel_yang_ditunjukadalah tipe data variabel dinamis yang ditunjuk oleh pointerTipe variabel ini bisa berupa tipe sederhana (integer, char, boolean, word) atau tipe yang lebih kompleks (real, record,array) Contoh:
type item = integer;pointitem = ^item;pointnode= ^integer;var ptr_ke_int : pointitem;
var a,b :pointitem;c,d : pointnode; Keterangan :
Pada contoh a)
tipe item adalah sama dengan tipe integer
tipe pointitem adalah tipe pointer yang menunjuk data bertipe item
tipe pointnode adalah tipe pointer yang menunjuk data bertipe integer
Pada contoh b)
variabel a dan b bertipe pointitem
variabel c dan d bertipe pointnode Kalau diperhatikan, pada contoh b) di atas keempat variabel (a,b,c dan d) semuanya merupakan variabel pointer yang menunjuk ke variabel bertipe integer. Meskipun demikian karena tipe dasarnya berbeda (variabel a dan b bertipe pointitem sedang variabel c dan d bertipe pointnode) maka dianggap bahwa variabel a dan b memiliki tipe yang sama, demikian pula c dan d, tetapi a tidak dapat disamakan dengan c atau d. Dengan demikian assignment a:= b dan c:= d adalah sah, tetapi a := d adalah ilegal.
ke atas halaman
Membuat Dan Menghapus/Merusak Variabel Dinamis Dalam bahasa Pascal, pembuatan variabel dinamis dapat dilakukan dengan prosedur standar NEW. Bila p adalah variabel pointer ke tipe node maka prosedur :NEW(p) akan menghasilkan suatu variabel dinamis bertipe node dan memberikan alamatnya ke pointer p. Untuk menghapus, merusak atau mengembalikan memori yang dipakai oleh variabel dinamis dapat digunakan prosedur dasar DISPOSE, misalnya DISPOSE(p) berarti mengembalikan memori yang ditempati oleh variabel dinamis yang ditunjuk oleh pointer p ke sistem.
Pointer Bernilai NIL Kadang suatu variabel pointer p tidak menunjuk ke suatu variabel dinamis. Ini dapat dilakukan dengan memberikan assignment p:= nil. Perlu dibedakan pengertian variabel pointer yang bernilai NIL dengan variabel pointer yang tak terdefinisi (tak tentu). Variabel pointer bernilai NIL berarti ia tidak menunjuk ke suatu variabel dinamis, sedang variabel pointer yang bernilai tak tentu berarti ia mungkin mengacu (menunjuk) ke suatu lokasi sembarang di memori. Dengan perintah DISPOSE(p) maka akan berakibat p menjadi tak tentu sehingga disarankan untuk mengassign dengan nilai NIL setiap kali suatu variabel dinamis dibebaskan (misal p :=NIL)
CATATAN Untuk mempermudah pemahaman tentang variabel pointer, berikut ini adalah cara pengartian tanda "^", bila diberikan deklarasi p : ^item:
p : ^item berarti p menunjuk ke suatu tipe item
p^ berarti apa yang ditunjuk oleh p Dengan demikian bila p dan q adalah dua variabel pointer bertipe sama, maka assignment p:= q dan p^ := q^ adalah legal. Meskipun demikian mereka mempunyai pengertian yang berbeda. p:= q berarti p dan q menunjuk ke lokasi yang sama, sedang p^ := q^ berarti p dan q menunjuk lokasi yang berbeda tetapi isi variabel dinamis yang ditunjuk keduanya sama. Jadi assignment yang kedua dapat diartikan seperti halnya meng-copy-kan isi variabel q ke variabel p sehingga isi keduanya sama.

0 komentar:

Post a Comment