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 PointerSoal: buat record mengenai data data mahasiswa (Nama, NPM, Jurusan), input dengan Readln dan tampilkan dengan Writeln
Static Variabel:
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:
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
Writeln(SizeOf(PMahasiswa));
Writeln(SizeOf(Pointer));
sebelum baris
readln;untuk standarisasi kita juga bisa memakai variabel Pointer sebagai deklarasi pengganti variabel PMahasiswa
contoh:
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:
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
