A. PENGERTIAN POINTER
1. Definisi Pointer
Suatu pointer (variable penunjuk) adalah suatu variable yang berisi dengan
alamat lokasi, yaitu suatu memori tertentu. Bahasa C menyediakan 2 buah
operator untuk operasi pointer yaitu operator ‘*’ dan operator ‘&’.
Pointer adalah sebuah variabel yang berisikan alamat memori (bukan nilai)
atau dengan kata lain dapat dikatakan bahwa pointer adalah suatu variabel
penunjuk ke lamat memori tertentu. Yang disimpan oleh variabel yang
didefinisikan sebagai pointer adalah ‘alamat’ variabel tersebut.
1
Pada operasi pointer, kita menggunakan 2 buah operator dalam bahasa C yaitu “*”
dan “&”. Dalam pembuatan program menggunakan pointer, tanda asterisk “*”
digunakan untuk menentukan variable yang menjadi suatu pointer.
Keterangan:
Contoh:
Setiap variabel yang kita buat pada program akan memiliki alamat
memori.Alamat memori berfungsi untuk menentukan lokasi penyimpanan data
pada memori (RAM). Kadang alamat memori ini disebut reference atau referensi.
Coba perhatikan gambar ini:
2
Pada gambar ini, kita membuat dua variabel.. yakni umur dan tinggi. Kedua
variabel ini punya alamat memori masing-masing.Variabel umur alamat
memorinya adalah 0001, sedangkan tinggi alamat memorinya 0002. Begitu
seterusnya.. Pokoknya, setiap kita membuat variabel pasti akan punya alamat
memori. untuk melihat alamat memori yang digunakan pada variabel, kita bisa
pakai simbol & (emphasis).
Alamat memori ini merupakan alamat memori dari variabel umur. Lalu, si
pointer p_tinggi menggunakan alamat memori dari variabel tinggi.Dengan
begini..Pointer akan bisa mengakses data yang tersimpan di dalam alamat memori
tersebut. Biar lebih jelas, mari coba dalam program. Buatlah program baru dengan
nama contoh_pointer.c, kemudian isi dengan kode berikut:
#include <stdio.h>
void main(){
// membuat variabel
int umur = 19;
float tinggi = 175.6;
// membuat pointer
int *pointer_umur = &umur;
int *pointer2 = &umur;
float *p_tinggi = &tinggi;
// mecetak alamat memori variabel
printf("alamat memori variabel 'umur' = %d\n", &umur);
printf("alamat memori variabel 'tinggi' = %d\n", &tinggi);
// mencetak referensi alamat memori pointer
printf("referensi alamat memori *pointer_umur = %d\n",
pointer_umur);
printf("referensi alamat memori *pointer2 = %d\n", pointer2);
printf("referensi alamat memori *p_tinggi = %d\n", p_tinggi);
}
3
Setelah itu, coba compile dan jalankan.
Hasil outputnya:
Alamat memori yang digunakan sebagai referensi pada pointer akan sama
dengan alamat memori dari variabel yang kita pakai sebagai referensi.
Tipe_data *nama_variabel_komputer
Seperti contoh, kita membuat deklarasi int *b, berarti sebuah pointer hanya
dapat menunjuk sebuah variable dengan tipe data integer Untuk mendapatkan
alamat dari suatu variabel, maka kita perlu menggunakan operator “&” di depan
variable tersebut. Adapun contoh dalam penggunaannya :
4
printf(“Alamat dari variabel a = %d”, &a);
Maka pada saat program dijalankan, akan muncul alamat dari variabel a
tersebut Untuk mendapatkan nilai dari suatu variable, maka pertintah yang
digunakan cukup hanya dengan memanggil variabel nya saja. Adapun contoh
penggunaannya :
Maka pada saat program dijalankan, akan muncul nilai dari variabel a
tersebut Untuk mendapatkan nilai dari suatu alamat yang terdapat pada isi pointer,
*b=&a
Maka pada saat program dijalankan, akan muncul nilai dari variabel yang
ditunjuk poleh pointer b, yaitu nilai dari variabel a tersebut pemrograman C)
adalah suatu variable yang berisikan suatu alamat lokasi tertentu. Untuk contoh
program yang mencari alamat dan nilai variabel, dapat kita lihat contoh koding
tersebut :
#include <stdio.h>
main(){
int *b;
int a;
a = 9;
5
printf("alamat variabel *b = %d\n”, &b);
b = &a;
Contoh:
Buku = &bahasa;
6
Bahasa = 25; Sejarah = bahasa; buku = &bahasa;
Maka hasilnya
Dengan menggunakan pointer kita dapat mengakses nilai yang tersimpan secara
langsung dengan memberikan awalan operator asterisk(*) pada identifier pointer,
yang berarti “value pointed by”.
Contoh:
BhsC = *buku
(dapat dikatakan bahwa BhsC sama dengan nilai yang ditunjuk oleh buku).
BhsC = 25, karena buku di alamat 1776, dan nilai yang berda pada lamat 1776
adalah 25.
7
Hasil dari program di atas adalah :
8
B. OPERATOR PADA POINTER
Dari kedua contoh tersebut terdapat kesimpulan bahwa operator pointer ada
dua, yaitu:
Operator Reference (*) yaitu dapat mengakses secara langsung nilai yang
terdapat didalam variabel yang berpointer, hal ini dapat dilakukan dengan
menambahkan identifier asterisk (*). Operator ini biasa disebut dengan “value
pointed by”.
9
Suatu variabel pointer seperti halnya variabel lain, juga bisa mengalami
operasi penugasan. Nilai dari suatu variabel pointer dapat disalin ke variabel
pointer yang lain
#include
void main()
{
floaty,*x,*z;
y=12.34;
x=&y;
z=x;//assignment antar variabel pointer
//berapakah nilai x?
//berapakah niali y?
}
#include
#include
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori
"< cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat
memori "< cout<<"Nilai "<<*(penunjuk+2) <<" ada di
10
alamat memori "< getch();
}
b. Operasi Aritmatika
Jika x adalah int, maka p++ akan menunjuk alamat 1002 (karena int
berukuran 2 byte)
Jika X adalah char, maka p++ akan menunjuk alamat 1001 (karena ukuran
char adalah 1 byte)
#include
void main()
{
int a[4]={10,20,30,40};
int *pa;
pa = a;
printf("pa = %d\n",pa);
printf("pa++ = %d\n",++pa);
}
#include
#include
11
void main()
{
int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori
"< cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat
memori "< cout<<"Nilai "<<*(penunjuk+2) <<" ada di
alamat memori "< getch();
}
c. Operasi Logika
Salah satu penggunaan pointer adalah untuk membuat suatu array yang
dinamis (banyaknya data yang bisa ditampung sesuai keperluan). Sebagaimana
kita ketahui jika kita membuat suatu program yang dapat menampung data nilai
sebanyak 5 buah maka kita akan membuat suatu variabel array yang bertipe int
dengan perintah int data[5]. Dengan cara begitu maka program hanya akan
berjalan dengan baik jika data yang diinputkan banyaknya di kurang atau sama
dengan 5 buah. Apa yang terjadi ketika data yang akan diinputkan ternyata 10
buah, maka langkah yang dilakukan adalah harus mengubah programnya dan
mengganti int data[5] menjadi int data[10].
12
Cara lain untuk membuat program tersebut adalah dengan menggunakan
suatu variabel array yang dinamis dimana pemesanan tempat yang diperlukan
untuk menyimpan data tidak dideklarasikan dalam program tapi dilakukan secara
runtime (ketika program berjalan).
E. BAHAYA POINTER
Bahaya yang mungkin ada dengan pointer sebagai moniker: memory leak,
double delete, invalid memory access. Semuanya dapat dihindari dengan
ownership analysis yang bagus (pada setiap saat, harus diketahui pihak mana yang
bertanggung jawab mendelete sebuah object). Jika hal ini sulit dilakukan,
misalnya karena shared ownership, anda dapat menggunakan smart pointer atau
garbage collector.
Bahaya yang mungkin ada dengan pointer sebagai iterator: array out of
bound. Salah satu carayang efektif menghindari hal ini adalah dengan
menggunakan standard algorithm.
Contoh :
int i,j; int *intptr = &i; atau bisa juga
int i,j, *intptr ; intptr = &i ;
input variable pointer ke jenis data integer dengan memberi harga awal berupa
13
alamat variable i.
Contoh :
#include<stdio.h>
void main()
{
14
dipergunakan, dengan menempatkannya di depan nama variabel. Sebagai contoh,
bila x dideklarasikan sebagai variabel bertipe int,
Maka :
&x
berarti “alamat dari variabel x”. Adapun contoh pemberian alamat x ke
suatu variabel pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke
data bertipe int) yaitu : px = &x;
Pernyataan di atas berarti bahwa px diberi nilai berupa alamat dari variabel
x. Setelah pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px
menunjuk ke variabel x.
Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk
oleh pointer tersebut dapat diakses melalui variabel itu sendiri (pengaksesan
langsung) ataupun melalui pointer (pengaksesan tak langsung). Pengaksesan tak
langsung dilakukan dengan menggunakan operator indirection (tak langsung)
berupa simbol * (bersifat unary).
program ptr1.c
15
int y, x = 87; /* x & y bertipe int */ int *px;
/* var pointer yang menunjuk ke data
d = d + 10;
Akan tetapi, seandainya tidak ada instruksi pd = &d;
maka pernyataan
16
/* Program : ptr3.c */
{
float d = 54.5f, *pd;
Contoh eksekusi :
J. POINTER VOID
Pointer void adalah pointer yang dapat menunjuk ke sembarang tipe data. Jadi
satu pointer dapat menunjuk ke tipe data integer, tipe data float, dan lain
sebagainya.
17
K. POINTER DAN ARRAY
dan
int *ptgl;
maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol.
Instruksi di atas bisa juga ditulis menjadi ptgl = tgl_lahir;
sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah
penugasan seperti di atas, *ptgl.
18
/* Program : ptr4.c */
static int
tgl_lahir[] = {16,
4, 1974}; int
*ptgl;
ptgl = tgl_lahir;
Contoh eksekusi :
/* Program : ptr4.c */
#include <stdio.h>
main()
{
19
*pkota = “SEMARANG”;
printf(“String yang ditunjuk oleh pkota = ”);
puts(pkota);
// printf(“%s\n”, pkota);
}
Contoh eksekusi :
20
M. ARRAY DARI POINTER
{“Senin”,
“Selasa”,
“Rabu”,
“Kamis”,
“Jumat”,
“Sabtu”,
“Minggu”};
Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan
contoh mengenai pointer menunjuk pointer.
21
Untuk membentuk rantai pointer seperti pada gambar di atas,
pendeklarasian yang diperlukan berupa
int var_x;
int *ptr1;
int **ptr2;
#include <stdio.h>
main()
22
printf("Nilai var_x = %d\n", *ptr1);
Contoh eksekusi :
Penerapan pointer sebagai parameter yaitu jika diinginkan agar nilai suatu
variabel internal dapat diubah oleh fungsi yang dipanggil. Sebagai contoh dapat
dilihat pada fungsi berikut.
23
Fungsi di atas dimaksudkan agar kalau dipanggil, variabel yang berkenaan
dengan parameter aktual dapat diubah nilainya, masing-masing dinaikkan sebesar
2. Contoh pemanggilan :naikkan_nilai(&a, &b);
Perhatikan, dalam hal ini variabel a dan b harus ditulis diawali operator
alamat (&) yang berarti menyatakan alamat variabel, sebab parameter fungsi
dalam pendefinisian berupa pointer.
/* Program : argptr.c
Fungsi dengan argument beberapa pointer :
#include <stdio.h>
main()
int a = 3, b = 7;
naikkan_nilai(&a, &b);
*x = *x + 2;
*y = *y + 2;
24
}
Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Misalnya, suatu
fungsi menghasilkan keluaran berupa pointer yang menunjuk ke string
nama_bulan, seperti pada contoh berikut.
char *nama_bulan(int n)
};
25
Dalam fungsi nama_bulan(), mula-mula array bernama bulan
dideklarasikan dan sekaligus diinisialisasi agar menunjuk sejumlah string yang
menyatakan nama bulan.
char *nama_bulan(int n)
};
26
Dalam fungsi nama_bulan(), mula-mula array bernama bulan
dideklarasikan dan sekaligus diinisialisasi agar menunjuk sejumlah string yang
menyatakan nama bulan.
#include <stdio.h>
char *nama_bulan(int
n); //prototype
function main()
scanf("%d", &bl);
pch = nama_bulan(bl);
char *nama_bulan(int n)
27
static char *bulan[] = { "Kode bulan salah",
"Januari
",
“Februari”,
“Maret”,
"April",
"Mei",
“Juni”,
“Juli”,
“Agustus”,
“September”,
“Oktober”,
“November”,
“Desember”
};
28
var alamatNilaiInteger:^integer;
var alamatNilaiReal:^real;
var alamatNilaiString:^string;
type TString20=string[20];
var alamatString20:^TString20;
var alamatArrayInt:^TArrayInt;
Nama:string[40];IPK:real;
end;
var alamatDataMhs:^TDataMhs;
Dalam contoh di atas, alamatNilaiInteger, alamatNilaiReal, alamatNilaiStri
ng,alamatTString20, alamatArrayInt dan alamatDataMhs, merupakan variabel bert
ipe pointer, karena dideklarasikan menggunakan tanda ^ (caret , tanda sisipan).
Dengan demikian, bisa disimpulkan bahwa untuk mendeklarasikan variabel
bertipe pointer, bentuk umumnya adalah:
var namaVariabelPointer:^tipeDataNilaiYangDitunjukPointer.
29
Menggunakan Keyword
namaVariabelPointer^
Untuk mendeklarasikan variabel pointer bertipe
struct bentuknya adalah sebagaiberikut:
Sebagaimana pointer yang menunjuki variabel bertipe sederhana, pointer
yang menunjukkan 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 dalams
truktur, dapat menggunakan salah satu cara di bawah ini:
(*p_struktur).nama_komponen
, atau
p_struktur->nama_komponen
30
Kita bahas dulu, mengapa pointer diciptakan?
Jadi zaman dulu, memori komputer itu sangat terbatas. Saat mengelola
struktur data kompleks seperti data pada array, linked list, tree, dan sebagainya..
sering kali memakan banyak memori. 2
Oleh sebab itu, diciptakanlah pointer agar mudah membuat struktur data
tersebut, dan tentunya lebih hemat memori.
Contoh:
31
Nilai variabel score tidak berubah, ia tetap bernilai 0.
Mengapa?
Variabel score kan dibuat di dalam fungsi main(), lalu ketika fungsi add_score() men
coba mengubah nilainya,
maka perubahan hanya terjadi secara lokal di dalam fungsi add_score() saja. Coba
buktikan dengan mengubah fungsi add_score() menjadi seperti ini:
Hasilnya:
32
Benar kan yang saya katakan.Nilai score pada fungsi add_score() sudah berubah
menjadi 5, namun variabel score pada fungsi main() akan tetap bernilai 0.
Nah..
Karena argumen fugsi add_score() kita ubah menjadi pointer, maka kita harus
memberikan alamat memori saat memanggilnya.
Maka hasilnya:
Setiap fungsi add_score() dipanggil atau dieksekusi, maka nilai variabelnya akan
bertambah 5.
33
Hasilnya:
34
KESIMPULAN
1. Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer
dimaksudkan untuk menunjukkan ke suatu alamat memori sehingga
alamat dari suatu variabel dapat diketahui dengan mudah.
36