ALGORITMA DAN PEMROGRAMAN 2 Oleh: Anis Cherid, M.T.I. 1. POINTER DALAM PASCAL Variabel bertipe pointer adalah variabel yang nilainya merupakan alamat memori, yaitu alamat memori dari sebuah nilai dengan jenis/tipe data tertentu. Di bawah ini disajikan contoh pendeklarasian beberapa variabel bertipe pointer: var alamatNilaiInteger:^integer; var alamatNilaiReal:^real; var alamatNilaiString:^string; type TString20=string[20]; var alamatString20:^TString20; type TArrayInt=array[1..10] of integer; var alamatArrayInt:^TArrayInt; type TDataMhs=record NIM:array[1..10] of '0'..'9'; Nama:string[40]; IPK:real; end; var alamatDataMhs:^TDataMhs; Dalam contoh di atas, alamatNilaiInteger, alamatNilaiReal, alamatNilaiString, alamatTString20, alamatArrayInt dan alamatDataMhs, merupakan variabel bertipe pointer, karena dideklarasikan menggunakan tanda ^ (caret, tanda sisipan). Dengan demikian, bisa disimpulkan bahwa untuk mendeklarasikan variabel bertipe pointer, bentuk umumnya adalah: var namaVariabelPointer:^tipeDataNilaiYangDitunjukPointer Terdapat 4 cara untuk mengisi nilai variabel pointer: 1. Menggunakan operator @ (address-of ). 2. Menggunakan variabel pointer yang lain. 3. Menggunakan prosedur new. 4. Menggunakan keyword NIL. Sedangkan untuk mengambil atau mengganti isi memori yang ditunjuk oleh sebuah variabel pointer, bentuknya adalah namaVariabelPointer^ (nama variabel pointer diikuti dengan tanda sisipan). CONTOH 1 Perhatikan contoh program di bawah ini: program contoh_1; var a,b:integer; alamatXXX:^integer; begin a:=14; b:=5; alamatXXX:=@a; {alamatXXX diisi dg alamat memori yang ditempati variabel a} writeln(alamatXXX^); {output:14}
{alamatXXX^ berarti "isi memori yang ditunjuk alamatXXX"} alamatXXX:=@b; {alamatXXX diisi dg alamat memori yang ditempati variabel b} writeln(alamatXXX^); {output:5} {alamatXXX^ berarti "isi memori yang ditunjuk alamatXXX"} end. CONTOH 2 Perhatikan contoh program di bawah ini: program contoh_2; var a:integer; alamatXXX:^integer; begin a:=14; alamatXXX:=@a; {alamatXXX diisi dg alamat memori yang ditempati variabel a} writeln(alamatXXX^); {output:14} {alamatXXX^ berarti "isi memori yang ditunjuk alamatXXX"}
end.
a:=20; writeln(alamatXXX^); {output:20} {alamatXXX menunjuk memori yang digunakan untuk menyimpan...} {...nilai variabel a. Karena nilai a diganti menjadi 20...} {...maka isi memori yang ditunjuk alamatXXX kini menjadi 20}
CONTOH 3 Perhatikan contoh program di bawah ini: program contoh_3; var a:integer; alamat1, alamat2:^integer; begin
a:=14; alamat1:=@a; {alamat1 berisi alamat memori yang ditempati variabel a} alamat2:=alamat1; {alamat2 diisi dengan alamat memori yang ditunjuk alamat1...} {...yang berarti bahwa alamat2 juga menunjuk memori yang...} {...ditempati variabel a.} writeln(alamat2^); {output:14} alamat2^:=5; {Alamat memori yang ditunjuk alamat2 diisi dengan 5} writeln(alamat1^); {output:5} {Karena alamat1 menunjuk alamat memori yang sama dengan...} {...alamat2, maka alamat1^ juga bernilai 5} writeln(a); {output:5}
{Karena alamat1 dan alamat2, keduanya menunjuk alamat...} {...memori yang ditempati variabel a, maka nilai variabel...} {...a kini menjadi 5} end. CONTOH 4 Perhatikan contoh program di bawah ini: program contoh_4_Array_dan_Record; type
var
TDataMhs=record NIM:string[10]; Nama:string[40]; IPK:real; end; TArrDataMhs=array[1..100] of TDataMhs; ArsipMhs:TArrDataMhs; alamatArsipMhs:^TArrDataMhs;
begin
end.
ArsipMhs[1].NIM:='123456790'; ArsipMhs[1].Nama:='Budi'; ArsipMhs[1].IPK:=3.5; alamatArsipMhs:=@ArsipMhs; writeln(alamatArsipMhs^[1].NIM); {output:123456790} alamatArsipMhs^[1].Nama:='Wati'; writeln(ArsipMhs[1].Nama); {output:Wati}
CONTOH 5 (CONTOH YANG SALAH) Penggunaan variabel pointer yang akan menimbulkan pesan kesalahan adalah sebagai berikut: program CONTOH_5_YANG_MENIMBULKAN_ERROR_MESSAGE; var a:integer; alamat1,alamat2:^integer; alamat3:^real; begin alamat1:=@a; alamat2:=alamat1; alamat3:=alamat1; {<<<<<
2. POINTER DALAM C
Di bawah ini disajikan contoh pendeklarasian beberapa variabel bertipe pointer dalam Bahasa C: int *alamat_nilai_integer; float *alamat_nilai_float; char *alamat_nilai_char; Dalam contoh di atas, alamat_nilai_integer, alamat_nilai_float danalamat_nilai_char, merupakan variabel bertipe pointer, karena dideklarasikan menggunakan tanda * (tanda bintang). Dengan demikian, bisa disimpulkan bahwa untuk mendeklarasikan variabel bertipe pointer, bentuk umumnya adalah: tipe_data *nama_variabel_pointer; Terdapat 4 cara untuk mengisi nilai variabel pointer dalam Bahasa C: 1. Menggunakan operator & (address-of ). 2. Menggunakan variabel pointer yang lain. 3. Menggunakan fungsi malloc. 4. Menggunakan 0. Sedangkan untuk mengambil atau mengganti isi memori yang ditunjuk oleh sebuah variabel pointer, bentuknya adalah *nama_variabel_pointer (tanda bintang diikuti nama variabel pointer). CONTOH 1 Perhatikan contoh program di bawah ini: /* program contoh_1 */ #include <stdio.h> void main(){ int a, b, *alamat_memori_1, *alamat_memori_2; a=14; b=5; alamat_memori_1=&a; /* alamat_memori_1 diisi dg alamat memori yang ditempati nilai variabel a */ printf("%p\n",alamat_memori_1); /* output: (alamat memori dengan format AAAA:BBBB) */ printf("%d\n",*alamat_memori_1); /* output:14 */ /* *alamat_memori_1 (bintang diikuti nama variabel) berarti: "isi memori yang ditunjuk oleh alamat_memori_1" */ alamat_memori_1=&b; /* alamat_memori_1 diisi dg alamat memori yang ditempati variabel b */ printf("%d\n",*alamat_memori_1); /* output:5 */ b=20; printf("%d\n",*alamat_memori_1); /* output:20, karena alamat_memori_1 menunjuk varibel b, maka perubahan terhadap nilai variabel b sama saja artinya dengan mengubah nilai dalam memori yang ditunjuk alamat_memori_1 */ *alamat_memori_1=1000; printf("%d\n",b); /* output:1000, karena alamat_memori_1 menunjuk variabel b, maka perubahan nilai dalam memori yang ditunjuk alamat_memori_1 sama saja artinya dengan mengubah nilai variabel b */ alamat_memori_2=alamat_memori_1; *alamat_memori_2=111;
}
printf("%d\n",b); /* output:111, karena alamat_memori_2 diisi dengan alamat dalam alamat_memori_1, maka alamat_memori_2 juga menunjuk variabel b. Dengan begitu, perubahan nilai dalam memori yang ditunjuk alamat_memori_2 sama saja artinya dengan mengubah nilai variabel b */
POINTER DAN ARRAY Dalam Bahasa C, variabel array merupakan pointer yang menunjuk alamat memori yang ditempati oleh elemen ke-0. Bahasa C juga mengijinkan dilakukannya operasi penjumlahan dan pengurangan terhadap sebuah variabel pointer dan hasil penjumlahan tersebut akan menyebabkan variabel pointer menunjuk alamat memori pada alamat yang sesudah atau sebelumnya, yaitu alamat memori yang jaraknya sebesar jumlah byte yang ditempati oleh tipe variabel yang diwakili oleh pointer tersebut. Jadi jika sebuah pointer bertipe int, maka operasi penjumlahan atau pengurangan akan menyebabkan alamat memori yang ditunjuk menjadi maju atau mundur sejauh sizeof(int). Dengan demikian, menambah nilai sebuah variabel pointer dengan satu, sama saja artinya dengan menunjuk elemen berikut dari array yang diwakili oleh variabel pointer tersebut. CONTOH 2 Perhatikan contoh program berikut ini: /* Program Contoh 2 */ #include <stdio.h> void main(){ int i, a[20], *p_array; printf("%p\n",a); for (i=0;i<20;i++){ a[i]=i; /* tiap elemen diisi dengan nilai yang sama dengan nomor elemennya */ } printf("%p\n",a); /* output: sebuah alamat memori, a adalah pointer */ p_array=a; /* karena a adalah array, maka a adalah pointer juga, sehingga tidak perlu menggunakan operator & */ printf("%d\n",*p_array); /* output : 0, p_array menunjuk elemen 0 */ printf("%d\n",*++p_array); /* output : 1, ++p_array menyebabkan elemen 1 yang sekarang ditunjuk oleh p_array */ p_array+=3; printf("%d\n",*p_array); /* output : 4, p_array sekarang menunjuk elemen 4 */ printf("%d\n",p_array[1]); /* output : 5, p_array[1] identik dengan a[4+1] */ p_array-=4; printf("%d\n",*p_array); /* output 0, p_array sudah dikurangi 4, sehingga kembali menunjuk elemen 0 array a */ printf("%d\n",*(a+5));
/* output : 5, *(a+5) identik dengan a[5] */ }
POINTER DAN VARIABEL TERSTRUKTUR Untuk mendeklarasikan variabel pointer bertipe struct, bentuknya adalah sebagai berikut: struct {/* definisi struktur */} *p_struktur; Sebagaimana pointer yang menunjuk variabel bertipe sederhana, pointer yang menunjuk variabel bertipe terstruktur akan menyebabkan alamat memori yang ditunjuk akan maju atau mundur sejumlah byte yang dipergunakan oleh tipe terstruktur tersebut. Sedangkan untuk menunjuk masing-masing komponen dalam struktur, dapat menggunakan salah satu cara di bawah ini: (*p_struktur).nama_komponen, atau p_struktur->nama_komponen CONTOH 3 Perhatikan contoh program di bawah ini: /* Program Contoh 3 */ #include <string.h> #include <stdio.h> void main(){ struct record_mhs { long nim; char nama[41]; float ipk; }; struct record_mhs arsip_mhs_informatika[10], *p_arsip_mhs_informatika; arsip_mhs_informatika[0].nim=123456789; strncpy(arsip_mhs_informatika[0].nama,"Budi",40); arsip_mhs_informatika[0].ipk=2.75; p_arsip_mhs_informatika=arsip_mhs_informatika; printf("%ld\n",p_arsip_mhs_informatika->nim); printf("%s\n",p_arsip_mhs_informatika->nama); printf("%4.2f\n",(*p_arsip_mhs_informatika).ipk); p_arsip_mhs_informatika[1].nim=123456890; strncpy(p_arsip_mhs_informatika[1].nama,"Yudi",40); p_arsip_mhs_informatika[1].ipk=3.00; printf("%ld\n",(arsip_mhs_informatika+1)->nim); printf("%s\n",(arsip_mhs_informatika+1)->nama); printf("%4.2f\n",(*(arsip_mhs_informatika+1)).ipk); } REFERENSI: [BOR95] Borland International. 1995. Object Pascal Language Guide. [SHT00] Victor Shtern. 2000. Core C++: A Software Engineering Approach. Prentice Hall.