BAB 10
POINTER
5.1
Tujuan
•
Tujuan bab 10 ini, adalah:
•
•
Praktikan memahami dan mengerti algoritma Pointer
Praktikan bisa membuat program dengan menggunakan Pointer
Praktikan mengetahui penggunaan Pointer
5.2 Pengertian Pointer
Variabel bertipe array merupakan suatu tipe data yang bersifat statis (ukuran dan
urutannya sudah pasti). Selain itu ruang memori yang dipakai olehnya tidak dapat dihapus bila
variabel bertipe array tersebut sudah tidak digunakan lagi pada saat program dijalankan. Untuk
memecahkan hal tersebut maka diperlukan suatu tipe data yang bersifat dinamis.
Perubah dinamis adalah suatu perubah yang akan dialokasikan hanya pada saat
diperlukan, yaitu setelah program dieksekusi. Dengan kata lain pada saat program dikompilasi,
lokasi untuk perubah tersebut belum ditentukan. Kompiler hanya akan mencatat bahwa suatu
perubah akan diperlakukan sebagai perubah dinamis.
Pada perubah Statis, isi pengingat pada lokasi tertentu (nilai perubah) adalah data
sesungguhnya yang akan diolah. Pada perubah dinamis, nilai perubah adalah alamat lokasi lain
yang menyimpan data sesungguhnya.
Ilustrasi:
10
A
1000
A
Gambar 1. Ilustrasi perubah statis
10
1000
Gambar 2. Ilustrasi perubah dinamis
Pada gambar 1 di atas. perubah A adalah perubah Statis. Dalam hal ini 1000 adalah nilai
data yang sesungguhnya dan disimpan pada perubah (lokasi) A. Sedangkan pada gambar 2
diatas perubah A adalah perubah dinamis. Nilai perubah ini, misalnya 10. Nilai ini bukan nilai
data yang sesungguhnya, tetapi lokasi dimana data yang sesungguhnya berada. Jadi dalam hal ini
data yang sesungguhnya tersimpan pada lokasi 10. Perubah dinamis disebut juga pointer yang
artinya kira-kira menunjuk ke sesuatu. Nilai data yang ditunjuk oleh suatu pointer biasanya
disebut sebagai simpul/node.
Jadi Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat memori dari suatu
variabel lain. Alamat ini merupakan lokasi dari obyek lain (biasanya variabel lain) di dalam
memori. Contoh, jika sebuah variabel berisi alamat dari variabel lain, variabel pertama dikatakan
menunjuk ke variabel kedua
Tabel 1. Perbedaan Array dengan Pointer
Kriteria
Sifat
Ukuran
Alokasi variabel
Array
Statis
Pasti
Saat program dijalankan sampai selesai
Pointer
Dinamis
Sesuai Kebutuhan
Dapat diatur sesuai kebutuhan
5.3 Deklarasi Pointer
Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan terlebih
dahulu sebelum digunakan. Bentuk Umum :
Tipe_data *nama_pointer;
Tipe data pointer mendefinisikan tipe dari obyek yang ditunjuk oleh pointer. Secara
teknis, tipe apapun dari pointer dapat menunjukkan lokasi (dimanapun) dalam memori. Bahkan
operasi pointer dapat dilaksanakan relatif terhadap tipe dasar apapun yang ditunjuk. Contoh,
ketika kita mendeklarasikan pointer dengan tipe int*, kompiler akan menganggap alamat yang
ditunjuk menyimpan nilai integer - walaupun sebenarnya bukan (sebuah pointer int* selalu
menganggap bahwa ia menunjuk ke sebuah obyek bertipe integer, tidak peduli isi sebenarnya).
Karenanya, sebelum mendeklarasikan sebuah pointer, pastikan tipenya sesuai dengan tipe obyek
yang akan ditunjuk.
Contoh : int *px;
char *sh;
Contoh Algoritma 1 :
Algoritma BacaVariabelPointer
{program utama untuk membaca dan menampilkan variable pointer}
Deklarasi
X, Y : integer
PX : Pointer to integer
Deskripsi
X ← 87
PX ← ↑X
Y ← ↑PX
Write(‘Alamat X = ‘,↑X)
Write(‘Isi PX = ‘,PX)
Write(‘Isi x = ‘,X)
Write(‘Nilai yang ditunjuk oleh PX = ‘,↑PX)
Write(‘Nilai Y = ‘,Y)
Contoh Program 1 :
//Program BacaVariabelPointer
#include <stdio.h>
#include <conio.h>
main()
{
int x,y;
/* x dan y bertipe int */
int *px;
/* px pointer yang menunjuk objek */
x = 87;
px = &x;
/* px berisi alamat dari x */
y = *px;
/* y berisi nilai yang ditunjuk px */
printf("Alamat x = %p\n", &x);
printf("Isi px = %p\n", px);
printf("Isi x = %i\n", x);
printf("Nilai yang ditunjuk oleh px = %i\n", *px);
printf("Nilai y = %i\n", y);
getch();
}
5.4 Operasi Pointer
a. Operasi Penugasan
Suatu variable pointer seperti halnya variable yang lain, juga bisa mengalami operasi
penugasan. Nilai dari suatu variable pointer dapat disalin ke variable pointer yang lain.
Contoh Algoritma 2 :
Algoritma OperasiPenugasanPointer
{program utama untuk membaca dan menampilkan hasil operasi penugasan dengan
pointer}
Deklarasi
Y : real
X1, X2 : pointer to real
Deskripsi
Y ← 13.45
X1 ← ↑Y
X2 ← X1
Write(’Nilai variabel Y = ’,Y,’ada di alamat’,X1)
Write(’Nilai variabel Y = ’,Y,’ada di alamat’,X2)
b. Operasi Aritmatika
Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja.
Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan. Operasi
penambahan dengan suatu nilai menunjukkan lokasi data berikutnya (index selanjutnya)
dalam memori. Begitu juga operasi pengurangan.
Contoh Algoritma 3 :
Algoritma OperasiAritmetika
{program utama untuk membaca dan menampilkan hasil operasi aritmetika dengan
pointer}
Deklarasi
Nilai : array[0..2] of integer
Penunjuk : pointer to integer
Deskripsi
nilai[0] ← 125
nilai[1] ← 345
nilai[2] ← 750
penunjuk ← ↑nilai[0]
write(’Nilai’, ↑penunjuk, ’ ada di alamat memori ’, penunjuk)
write(’Nilai’, ↑(penunjuk+1),’ ada di alamat memori ’, (penunjuk+1))
write(’Nilai’, ↑(penunjuk+2),’ ada di alamat memori %p\n", penunjuk+2)
c. Operasi Logika
Suatu pointer juga dapat dikenai operasi logika.
Contoh Algoritma 4 :
Algoritma OperasiLogika
{program utama untuk membaca dan menampilkan hasil operasi logika dengan pointer}
Deklarasi
a, b : integer
Pa, Pb : pointer to integer
a ← 100
b ← 200
pa ← ↑a
pb ← ↑b
if (pa < pb) then
write(‘pa menunjuk ke memori lebih rendah dari pb’)
else if (pa = pb) then
write(’pa menunjuk ke memori yang sama dengan pb’)
else
write(‘pa menunjuk ke memori lebih tinggi dari pb’)
5.5 Pointer Dan String
Contoh Algoritma 4 :
Algoritma PointerString
{program utama untuk membaca dan menampilkan hasil string dengan tipe pointer}
Deklarasi
nama1, nama2 : pointer to string
namax : string
↑nama1 ← ’SPIDERMAN’
↑nama2 ← ’ GATOTKACA’
write(‘SEMULA : ’)
write(‘Saya suka ‘,nama1)
write(’Tapi saya juga suka ’, nama2);
/* Penukaran string yang ditunjuk oleh pointer nama1 dan nama2 */
write(’SEKARANG :’)
write(’Saya suka ’, ↑nama1)
write("Dan saya juga masih suka, ↑nama2)
Contoh Algoritma 5 :
Procedure misteri1(input/output s : Pointer to string)
{algoritma untuk membaca dan menampilkan hasil string dengan tipe pointer memakai
procedure}
while ( ↑s ≠ '\0' ) do
if (↑s >= 'a') and (↑s <= 'z' ) then
↑s -= 32
++s
endwhile
Algoritma PointerString
{program utama untuk membaca dan menampilkan hasil string dengan tipe pointer dengan
procedure}
Deklarasi
string : array of string
string[] ← ‘characters’
write(‘String sebelum proses adalah ‘, string)
misteri1(string)
write(‘String setelah proses adalah ‘, string)
5.6 Pointer Menunjuk Suatu Array
Contoh Algoritma 6 :
Algoritma PointerArray
{program utama untuk membaca dan menampilkan hasil array dengan tipe pointer}
Deklarasi
tgl_lahir[] : array of integer
Ptgl : pointer to integer
tgl_lahir[] ← ‘13,9,1982’
ptgl ← tgl_lahir
/* ptgl berisi alamat array */
write(‘Diakses dengan pointer’)
write(‘Tanggal = ‘, *ptgl)
write(‘Bulan ‘, ↑(ptgl + 1))
write(‘Tahun = ‘,↑ (ptgl + 2))
write(‘Diakses dengan array biasa’)
write(‘Tanggal = ‘, tgl_lahir[0]);
write(‘Bulan = ‘, tgl_lahir[1])
write(‘Tahun = ‘, tgl_lahir[2])
5.7 Memberi Nilai Array Dengan Pointer
Contoh Algoritma 7 :
Algoritma PointerNilaiArray
{program utama untuk membaca dan menampilkan nilai array dengan pointer}
Deklarasi
x : array(0..5) of integer
p : pointer to integer
k : integer
p←x
x[0] ← 5
/* x[0] diisi dengan 5 sehingga x[0] = 5 */
x[1] ← x[0]
/* x[1] diisi dengan x[0] sehingga x[1] = 5 */
x[2] ← ↑p + 2
/* x[2] diisi dengan x[0] + 2 sehingga x[2] = 7 */
x[3] ← ↑(p+1) - 3
/* x[3] diisi dengan x[1] - 3 sehingga x[3] = 2 */
x[4] ← ↑(x + 2)
/* x[4] diisi dengan x[2] sehingga x[4] = 7 */
for k→0 to 5 do
write(’x[k] = ’, x[k])