Jumat, 30 Oktober 2009

aLL pointer di C++

Pengertian Pointer

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.

Secara umum, dalam pembicaraan tentang pointer, tipe data pointer digambarkan sebagai tanda panah sedang variabel yang ditunjuk digambarkan sebagai kotak.

Kegunaan Pointer

Alasan mengapa harus menggunakan pointer yang utama adalah untuk menyimpan alamat memori dari sebuah variabel (data type atau object dari class). Selain menyimpan alamat dari variabel, pointer juga dapat digunakan untuk menyimpan alamat dari sebuah fungsi (function pointer).

Function pointer telah digunakan sejak dikenalkannya bahasa C,dan banyak digunakan untuk sebuah fungsi callback atau untuk meningkatkan readability dari sebuah code

Anda dapat memperlakukan function pointer seperti pointer biasa (pointer ke datatype/object), anda dapat menyimpan,mengirimkan, merubah address, atau meng-evaluasi address dari pointer ke fungsi ini dengan sifat tambahan anda dapat memanggil fungsi yang ditunjuk oleh function pointer.

Atau bisa juga pointer berguna untuk :
1. Mengirimkan “Parameter yang berupa variabel” ke dalam fungsi, artinya nilai
variabel bisa diubah di dalam fungsi

2. Untuk membuat variabel DINAMIS (Bukan variabel Statis)

penggunaan function pointer pada C++ dibatasi, yaitu function pointer tidak boleh menunjuk pada function yang berada dalam sebuah class (class member function) kecuali function tersebut berjenis static.

Mengapa sih harus menggunakan POINTER dalam bahasa C++ ...??? Karena dapat meningkatkan kinerja untuk operasi yang dilakukan secara berulang.
dengan syarat Kalau mendeklarasikan pointer kedalam array, tidak boleh menggunakan tanda bintang

Operator yang digunakan untuk pointer adalah tanda “*” dan tanda “&”.
tanda “*” ini berfungsi sebagai penunjuk nilai dari suatu pointer sedangkan tanda
“&” digunakan sebagai penunjuk alamat dari suatu variable.
Pointer di gunakan untuk mengalokasikan tempat pada memori secara dinamis yakni dapat diubah-ubah alokasi tempatnnya pada memori.
data yang dimasukkan sebagai nilai pointer akan selalu tersimpan sehingga diperlukan penghapusan yang tujuannya untuk mengosongkan memori, perintah yang digunakan untuk menghapus memori adalah delete [] nama variable.

*Operasi pointer dapat diterapkan pada tipe data Array,tipe data Struck,
*Pointer dapat digunakan untuk mengakses elemen array
*Pointer dapat menunjuk alamat pointer lain.

Cara Penggunaan function Pointer

pada contoh ini akan diperlihatkan contoh penggunaan function pointer untuk membuat sebuah mekanisme callback, pada contoh ini kita membuat sebuah fungsi pembagi dengan op1/op2, dimana kita harus mencegah op2=0

int bagi(int op1,int op2,bool (*fpTest)(int op1,int op2))
{
if(fpTest != NULL)
{
if(fpTest(op1,op2) == false)return -1;
}
return op1/op2;
}

bool Verifier(int op1,int op2)
{
if(op2==0)
{
printf("\nerror:Operand2 berisi 0 mengakibatkan division by zero");
return false;
}
if(op1 < 2 =" %d" 0 =" %d" 4 =" %d" 4 =" %d" style="font-weight: bold;">

SYARAT MENGGUNAKAN POINTER

Jika variabel merupakan isi memori, dan untuk mengakses isi memori tersebut diperlukan address, lalu bagaimana cara kita mengetahui alamat dari suatu variabel ? Jawabannya adalah : untuk kebanyakan kasus kita sama sekali tidak perlu tahu alamat dari sebuah variabel. Untuk mengakses sebuah variabel kita hanya perlu nama dari variabel tersebut. Tugas kompiler lah yang mentranslasikan nama ke alamat mesin yang diperlukan oleh komputer.

Akan tetapi terdapat beberapa kasus dimana kita tidak mungkin memberi nama pada sebuah entitas di program kita. Hal ini terjadi terutama saat kita menggunakan data struktur dinamis seperti linked list, resizeable array, tree dan lain sebagainya. Hal ini karena kita tidak mungkin memberi nama terhadap entitas yang mungkin ada atau tidak ada. Struktur seperti linked list hampir mustahil dibuat tanpa pointer tanpa harus mendefinisikan LISP-like list.

TIPE DATA

Tipe data yang dapat menggunakan pointer adalah tipe yang digunakan untuk membuat variable memory yang dinamis, bisa digunakan untuk menyimpan alamat memori ataupun data.

http://www.scribd.com/doc/9135744/Modul-Praktek-Bahasa-C

Tipe pointer adalah data yang berisi suatu alamat yang menunjuk ke lokasi tertentu. Bila pointer berisi alamat dirinya sendiri maka pointer tidak menunjuk ke manapun disebut nil.

Tipe data pointer ini dipergunakan untuk keperluan pengalamatan pada memory, contohnya pengalokasian variabel dinamik. Nilai suatu variabel pointer dapat diisi dengan cara:
· Menggunakan prosedur New atau getmem.
· Dengan operator @.
· Menggunakan fungsi Ptr.

Contoh:

Type
PenunjukKaryawan = ^CatatanKaryawan
Catatankaryawan=Record
Kode : string[5];
Nama : string[25];
Gaji : Real;
End;
Var
Datakaryawan : Penunjukkaryawan;

Pada deklarasi ini, tipe data PenunjukKaryawan adalah tipe data pointer yang menunjuk ke suatu record CatatanKaryawan dan deklarasi dari record ini dapat diletakkan dibawahnya.

Variabel dinamik dapat dihapus dari heap menggunakan prosedur standar Dispose dan prosedur standar Mark dan Release. Prosedur standar Mark hanya akan memberi tanda saja dan yang digunakan untuk menghapusnya adalah prosedur standar Release.

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.

Operator Pointer ada dua, yaitu :

Ø Operator &

· Operator & bersifat unary (hanya memerlukan satu operand saja).

· Operator & menghasilkan alamat dari operandnya.

Ø Operator *

· Operator * bersifat unary (hanya memerlukan satu operand saja).

· Operator * menghasilkan nilai yang berada pada sebuah alamat.

Misalnya X adalah suatu variabel biasa yang berisi nilai karakter ‘ J ‘. X bukan variabel pointer. Nilai dari X oleh compiler C++ akan diletakkan di suatu lokasi memori tertentu. Nilai ini dapat diakses jika diketahui alamat memorinya. Untuk mengetahui alamat memori yang digunakan oleh variabel X dalam menyimpan nilai datanya dapat diketahui dengan ungkapan &X.

Alamat tersebut dapat ditulis dengan mengambil sebuah variabel lagi yang disebut dengan variabel pointer, misalnya Alamat_X=&X. Alamat_X adalah variabel pointer karena variabel ini menunjuk ke lokasi memori di mana nilai data dari variabel X disimpan.

Operator Pointer

Ada 2 operator pointer yang dikenal secara luas, yaitu operator & dan operator *.

1. Operator &

Operator & merupakan operator alamat. Pada saat pendeklarasian variable, user tidak diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara otomatis oleh kompiler dan operating sysem pada saat run-time. Jika ingin mengetahui dimana suatu variable akan disimpan, dapat dilakukan dengan memberikan tanda ampersand (&) didepan variable , yang berarti "address of". Contoh :

ted = &andy;

Penulisan tersebut berarti akan memberikan variable ted alamat dari variable andy. Karena variabel andy diberi awalan karakter ampersand (&), maka yang menjadi pokok disini adalah alamat dalam memory, bukan isi variable. Misalkan andy diletakkan pada alamat 1776 kemudian dituliskan instruksi sbb :

andy = 25;

fred = andy;

ted = &andy;



2. Operator *

Operator * merupakan operator reference. 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 :

beth = *ted;

(dapat dikatakan:"beth sama dengan nilai yang ditunjuk oleh ted") beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat 1776 adalah 25.




Ekspresi dibawah ini semuanya benar, perhatikan :

andy = 25;

&andy = 1776;

ted = 1776;

*ted = 25;




Ekspresi pertama merupakan assignation bahwa andy = 25;. Kedua, menggunakan operator alamat (address/derefence operator (&)), sehingga akan mengembalikan alamat dari variabel andy. Ketiga bernilai benar karena assignation untuk ted adalah ted = &andy;. Keempat menggunakan reference operator (*) yang berarti nilai yang ada pada alamat yang ditunjuk oleh ted, yaitu 25. Maka ekspresi dibawah ini pun akan bernilai benar :

*ted = andy;

sekilas tentang pointer

Pointer adalah tipe data yang dapat menunjuk ke lokasi tertentu di memori. Untuk mendefinisikan sebuah variabel pointer, kita bisa menggunakan ^ atau bisa menggunakan Pointer. Perhatikan contoh berikut ini.

var p1: ^Integer; // Pointer to integer
p2: ^Real; // Pointer to real number
px: Pointer // Untyped pointer

Variabel p1 adalah variabel dengan tipe pointer to integer, artinya nilai yang ditunjuk oleh p1 adalah nilai bertipe integer. Variabel p2 adalah pointer to real, artinya nilai yang ditunjuk oleh variabel ini adalah bilangan real. Semetera variabel px adalah untyped pointer, artinya tipe yang ditunjuk oleh variabel pointer ini tidak ditentukan. Variabel bertipe untyped pointer akan kompatibel dengan variabel pointer bertipe apapun. Menggunakan utyped pointer pada umumnya lebih fleksibel tetapi kurang aman.

Mengambil nilai yang ditunjuk oleh sebuah variabel pointer biasanya disebut sebagai dereferencing pointer. Untuk melakukan dereferencing pointer, kita harus menggunakan simbol ^. Bila p adalah pointer, maka p^ adalah nilai yang ditunjuk oleh p. Kita bisa mengisi sebuah pointer dengan alamat variabel lain, atau kita bisa mengalokasikannya dari heap memory. Untuk mengambil alamat dari suatu variabel tertentu, kita dapat menggunakan simbol @. Dengan demikian @a berarti alamat dari variabel a. Ada sebuah nilai konstanta khusus yang disebut dengan nil, yang berarti pointer tindak menunjuk ke manapun. Perhatikan contoh berikut ini

var
a: Integer;
p1, p2, p3: ^Integer;
begin
p1 := @a;
p2 := p1;
p2^ := 100;
p3 := nil;
end;

Ilustrasi pointer assignment

Pada langkah pertama, p1 diisi dengan alamat dari a (@a). Jadi setelah langkah pertama tersebut, pointer p1 menunjuk ke variabel a. Langkah kedua p2 diisi dengan nilai p1. Ini berarti p2 menunjuk ke a juga. Langkah ketiga p2^ diisi dengan 100. Artinya alamat di memori yang ditunjuk oleh p2 diisi dengan sebuah nilai interger 100. Setelah perintah ini, nilai a, nilai p1^, maupun p2^ adalah sama, yaitu 100. Langkah keempat, p3 diisi nil sehingga p3 sekarang tidak menunjuk kemana-mana. Perlu dicatat disini bahwa variabel pointer tidak diinisialisasi, sehingga isinya bisa menunjuk ke alamat tertentu yang tidak valid. Perkecualian diberikan kepada variabel pointer yang dimiliki oleh objek, dimana nilainya diinisialisasi dengan nil.

Operator dalam Pointer

Beberapa operator yang dapat dioperasikan dengan pointer adalah sebagai berikut
^, Untuk mengakses data yang ditunjuk oleh suatu variabel pointer. Operator ini hanya bekerja untuk typed pointer.
=, Untuk memeriksa apakah dua variabel pointer menunjuk alamat yang sama atau tidak
<>, Untuk memeriksa apakah dua variabel pointer menunjuk alamat yang berbeda
@, Untuk mengetahui alamat variabel tertentu. Operand dari operator ini adalah variabel apapun, sedangkan hasil dari operator ini adalah pointer. Peran operator ini sama persis dengan function Addr.

Kamis, 29 Oktober 2009

Pointer dalam Bahasa C++

Pointer di C/C++

Seperti biasanya, saya ga akan menjelaskan pointer dengan cara seperti di buku-buku pemrograman dengan c/c++. Saya akan membagikan pengetahuan pointer dengan cara yang mudah ajah…ga kuat otak saya bahas yang rumit, baca aja buku-buku pemrograman c/c++ klo mau detail.

Jika saya punya variabel x dengan type int misalnya (ga penting siy typenya), variabel tersebut kan punya alamat sehingga program bisa memanggil variabel x tersebut dan menanyakan valuenya. Nah, misal saya buat variabel lagi dengan valuenya adalah alamat dari variabel x, sehingga jika saya panggil variabel y, saya bisa menanyakan juga isi dari variabel x maka variabel y disebut pointer untuk variabel x. Cara mendeklarasikan variabel y adalah:

int *y = &x;

atau:

int *y = 0;

y = &x;

Type dari variabel pointer y adalah int, yaitu mengikuti type dari variabel x. Untuk menandakan y adalah pointer, di depan variabel y pada saat deklarasi diberi tanda bintang (*) dan di depan x saya beri tanda and (&) yaitu return alamat dari x. Dengan demikian, jika kita panggil y tanpa bintang (*) maka kita akan mendapat alamat dari x, sedangkan jika kita panggil y dengan bintang (*) yaitu *y maka kita akan mendapatkan value dari x.

Saya paling suka menggunakan pointer untuk passing parameter ke fungsi. sehingga saya ga perlu menentukan return dari fungsi karena value dari variabel yang saya passing langsung diolah dalam fungsi. Misal:

int x;

x = 2;

void plusdua(int *y) {

*y += 2;

}

Jadi kalau saya panggil plusdua(&x) otomatis setelah itu x berubah jadi 4, karena y mengacu ke variabel x.

Untuk memahami lebih jauh, temen-temen baca aja buku-buku yang terkait ya…met mencoba…