Author Topic: [STRUKTUR DATA] Dasar Dasar Pointer.  (Read 781 times)

0 Members and 1 Guest are viewing this topic.

Offline Anta

  • Developer
  • Advanced
  • *
  • Posts: 710
  • Reputasi Poin: 39
  • Gender: Male
    • View Profile
[STRUKTUR DATA] Dasar Dasar Pointer.
« on: October 10, 2008, 02:55:52 AM »
Pointer bisa diibaratkan petunjuk alamat memory.

Pointer VS Variabel Statis
Keterangan | Variabel Statis | Pointer
Insialisasi dan Deinisialiasi | Statis (pada saat program dijalankan inisialisasi, pada saat program di tutup deinisialisasi) | Dinamis (mau kapan aja bisa inisialisasi dan deinisialisasi)
Pengoprasian | Gampang (tinggal pake) | Lumayan Susah (harus di GetMem dan FreeMem, kalo engga bisa AV ato crash)
Size Of Variabel | Tergantung Tipenya | 4 Byte
Jumlah di memory | Terbatas tergantung stack (kalo ga salah) | Tidak terbatas (tergantung besar memory kita)

Perbedaan Pemanggilan antara Static Variabel dan Pointer
Soal: buat record mengenai data data mahasiswa (Nama, NPM, Jurusan), input dengan Readln dan tampilkan dengan Writeln

Static Variabel:
Code: [Select]
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type TMahasiswa = record
                    Nama : String[100];
                    NPM  : String[10];
                    Jurusan : String[30];
                   end;


var Mhs : TMahasiswa;
begin
  Write('Masukan Nama : '); Readln(Mhs.Nama);
  Write('Masukan NPM : '); Readln(Mhs.NPM);
  Write('Masukan Jurusan : '); Readln(Mhs.Jurusan);
  Writeln;
  Writeln;
  Write('Nama : '); Writeln(Mhs.Nama);
  Write('NPM : '); Writeln(Mhs.NPM);
  Write('Jurusan : '); Writeln(Mhs.Jurusan);

  readln;
end.

Pointer:
Code: [Select]
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type PMahasiswa = ^TMahasiswa; // < -- artinya adalah Pointer dari TMahasiswa
     { inget aja tanda ^ adalah pointer dari suatu record / tipe variabel yang akan dipointerkan }

     TMahasiswa = record
                    Nama : String[100];
                    NPM  : String[10];
                    Jurusan : String[30];
                   end;


var Mhs : PMahasiswa;

begin

  GetMem(Mhs, SizeOf(TMahasiswa));
  { ^ minta ke OS space memory sebesar 143 byte (ukuran TMahasiswa)
    dan tunjuklah dengan Pointer Mhs alamat memory yang telah dialokasikan tersebut }
  Write('Masukan Nama : '); Readln(Mhs^.Nama);
  { inget pengaksesan data pada pointer harus memakai ^
    contoh: suaturecordvariabel^.suatuvariabeldalamrecord
            Mhs^.Nama
    Kenapa?, karena kita mau mengakses data pada alamat pointer tersebut
  }

  Write('Masukan NPM : '); Readln(Mhs^.NPM);
  Write('Masukan Jurusan : '); Readln(Mhs^.Jurusan);
  Writeln;
  Writeln;
  Write('Nama : '); Writeln(Mhs^.Nama);
  Write('NPM : '); Writeln(Mhs^.NPM);
  Write('Jurusan : '); Writeln(Mhs^.Jurusan);
  readln;
  FreeMem(Mhs);
end.

* nah kan perbedaannya pada saat pertama kali kita harus:
1. inisialisasi memory
2. memakai ^ dalam mengakses data
3. Mendeinisialisasi / destroy alamat tersebut pada akhir program agar alamat memory yang telah terpakai oleh pointer tersebut dapat dipakai oleh program / variabel lain.

Harus kita inget bahwa semua pointer bernilai 4byte.
Enggak percaya? coba di program atas kamu kasih tambahan code
Code: [Select]
Writeln(SizeOf(PMahasiswa));
Writeln(SizeOf(Pointer));
sebelum baris readln;

untuk standarisasi kita juga bisa memakai variabel Pointer sebagai deklarasi pengganti variabel PMahasiswa
contoh:
Code: [Select]
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type PMahasiswa = ^TMahasiswa; // < -- artinya adalah Pointer dari TMahasiswa
     { inget aja tanda ^ adalah pointer dari suatu record / tipe variabel yang akan dipointerkan }

     TMahasiswa = record
                    Nama : String[100];
                    NPM  : String[10];
                    Jurusan : String[30];
                   end;


var Mhs : Pointer;

begin
  GetMem(Mhs, SizeOf(TMahasiswa));
  Write('Masukan Nama : '); Readln(PMahasiswa(Mhs)^.Nama);
  Write('Masukan NPM : '); Readln(PMahasiswa(Mhs)^.NPM);
  Write('Masukan Jurusan : '); Readln(PMahasiswa(Mhs)^.Jurusan);
  Writeln;
  Writeln;
  Write('Nama : '); Writeln(PMahasiswa(Mhs)^.Nama);
  Write('NPM : '); Writeln(PMahasiswa(Mhs)^.NPM);
  Write('Jurusan : '); Writeln(PMahasiswa(Mhs)^.Jurusan);
  FreeMem(Mhs);
  readln;
end.
* kenapa harus pake PMahasiswa(Mhs)?, sebenernya itu samanya peng"alias"an, jadi oleh Delphi alamat Pointer Mhs akan dianggap sebagai record TMahasiswa.

contoh agak extreme kaya gini:
Code: [Select]
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type PMahasiswa = ^TMahasiswa; // < -- artinya adalah Pointer dari TMahasiswa
     { inget aja tanda ^ adalah pointer dari suatu record / tipe variabel yang akan dipointerkan }
     PDosen = ^TDosen;

     TMahasiswa = record
                    Nama : String[100];
                    NPM  : String[10];
                    Jurusan : String[30];
                   end;
     TDosen = record
                  Nama : String[100];
                  Telepon : String[100];
                  Matakuliah : String[30];
              end;

var Mhs : Pointer;

begin
  GetMem(Mhs, SizeOf(TMahasiswa));
  Write('Masukan Nama : '); Readln(PDosen(Mhs)^.Nama); // <- bedanya
  Write('Masukan NPM : '); Readln(PMahasiswa(Mhs)^.NPM);
  Write('Masukan Jurusan : '); Readln(PMahasiswa(Mhs)^.Jurusan);
  Writeln;
  Writeln;
  Write('Nama : '); Writeln(PDosen(Mhs)^.Nama); // <- bedanya
  Write('NPM : '); Writeln(PMahasiswa(Mhs)^.NPM);
  Write('Jurusan : '); Writeln(PMahasiswa(Mhs)^.Jurusan);
  FreeMem(Mhs);
  readln;
end.
* program diatas memiliki 2 tipe record yang berbeda yaitu mahasiswa dan dosen. dan sub variabel nama pada pointer mhs dipaksa dengan alias record dosen dan mahasiswa karena sub variabel nama mempunya panjang yang sama dan alamat ditempat yang sama....

ok segini dulu, ditunggu komentarnya, jadi bisa direvisi biar bahasanya ga belepotan :D

Offline Dhanny

  • Administrator
  • Expert
  • *
  • Posts: 1,080
  • Reputasi Poin: 41
  • Gender: Male
    • View Profile
Re: [STRUKTUR DATA] Dasar Dasar Pointer.
« Reply #1 on: October 10, 2008, 07:12:46 AM »
Ta, agak kasian jg mereka
Apa kaga bingung tuh dikasi kaya gituan???
Hehehe

Mungkin mereka bertanya:
1. "Apakah untuk pointer harus melakukan GetMem n FreeMem?"
    "Rasanya kalo di kelas koq ga dipake?"
2. "Kalo ga dipake, efeknya apa?"

Nanti kalo sempet, sy tambahin lg penjelasannya
Maaf, hari ini cukup padat jadwalku

Offline headscout

  • Mahasiswa
  • Advanced
  • *
  • Posts: 977
  • Reputasi Poin: 44
  • Gender: Male
  • New Logo, New Concept, New Technology
    • View Profile
    • Facebook
Re: [STRUKTUR DATA] Dasar Dasar Pointer.
« Reply #2 on: October 10, 2008, 08:14:31 PM »
Hehe.... saya mau nanya.... waktu itu saya pernah pakai type pointer.... saya mau tanya.. apa type pointer itu untuk string.... soalnya waktu itu terbalik-balik lambang type pointer itu sama tanda pangkat pada komputer....

Thx sebelumnya ^^
Supported by :


Offline Anta

  • Developer
  • Advanced
  • *
  • Posts: 710
  • Reputasi Poin: 39
  • Gender: Male
    • View Profile
Re: [STRUKTUR DATA] Dasar Dasar Pointer.
« Reply #3 on: October 10, 2008, 11:40:10 PM »
Hehe.... saya mau nanya.... waktu itu saya pernah pakai type pointer.... saya mau tanya.. apa type pointer itu untuk string.... soalnya waktu itu terbalik-balik lambang type pointer itu sama tanda pangkat pada komputer....

Thx sebelumnya ^^
pointer itu untuk variable bertipe apa saja, bebas.
pointer hanyalah petunjuk alamat memory.
tanda ^ pada suatu deklarasi tipe varibel lebih berarti si variabel yang dideklarasikan adalah suatu pointer yang strukturnya seperti tipe variabel yang dideklarasikan:
gini:
Code: [Select]
type PReal = ^Real; // PReal adalah Pointer dari tipe variabel Real

type PMhs =  ^TMhs; // PMhs adalah Pointer dari tipe variabel TMhs
       TMhs = Record
                      Nama : String[100];
                      Alamat : String[100];
                      Telp : String[30];
                  End; // TMhs berstruktur (Nama Char(100), Alamat Char(100), Telp Char(30))

dalam coding biasa kita seringkali udah memesan alamat untuk semua variabel:
contoh:
Code: [Select]
var a, b : Integer;

dengan pointer kita dapat mengetahui alamat suatu variabel dan melakukan perubahan, atau pun dengan pointer pula kita dapat memesan memori untuk suatu variabel secara dinamis

contoh variabel hacking dengan pointer:
Code: [Select]
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
   PInteger = ^Integer;

var b : PInteger;
    a : integer;

begin
  a := 10; // set variabel a dengan angka 10
  Writeln(a); // tampilin (Pasti 10 kan?)
  b := @a; // posisikan pointer b pada alamat memory variabel a
  b^ := 12; // set data pada alamat pointer b dengan nilai 12
  writeln(a); // tampilkan (kok 12 ya padahal yang diset 12 kan data pada pointer b)
  readln;
end.
* contoh diatas dimana pointer b diarahkan ke alamat memory variabel a, dan jika data pada pointer b di ganti, maka variabel a juga berubah karena alamat pointer data variabel b adaah variabel a.
« Last Edit: October 11, 2008, 12:06:55 AM by Anta »