POINTER
1)
Pengertian
Pointer
Pointer
adalah suatu variabel penunjuk, berisi nilai yang menunjuk alamat suatu lokasi
memori tertentu. Variabel merupakan suatu nilai yang disimpan dalam memory yang
dapat diakses dengan identifier.
Variabel ini sesunggunhnya disimpan pada suatu alamat didalam memory. Dimana
setiap alamat memory akan berbeda
dengan yang lainnya (unik).
Jadi pointer tidak berisi
nilai data, melainkan berisi suatu alamat memori atau null jika tidak berisi
data.Pointer yang tidak diinisialisasi disebut dangling pointer. Lokasi
memori tersebut bisa diwakili sebuah variabel atau dapat juga berupa
nilai alamat memori secara langsung.
2)
Ilustrasi
Pointer
1)
Kita
memiliki variabel X yang berisi nilai karakter ‘a’
2)
Oleh
kompiler C, nilai ‘a’ ini akan disimpan di suatu alamat tertentu di memori.
3)
Alamat
variabel X dapat diakses dengan menggunakan statemen &X.
4)
Jika
kita ingin menyimpan alamat dari variabel X ini, kita dapat menggunakan suatu
variabel
◦ misalnya char alamat_x =
&X;
5)
alamat_x
adalah suatu variabel yang berisi alamat dimana nilai X, yaitu ‘a’
disimpan.
6)
|
Tabel variable
pointer :
3)
Operator
pointer
Lihat & pahami table di bawah
ini :
|
Dari table diatas, maka operator
pointer terdiri dari :
1)
Operator
Alamat (Address operator (&))
Pada
saat pendeklarasian variable,
user tidak diharuskan
menentukan lokasi sesungguhnya pada memory, hal ini akan
dilakukan secara otomatis oleh kompilerdan 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;
Akan memberikan variable ted alamat dari
variable andy, karena variable 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
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
Deklarasi variable bertipe pointer
Format deklarasi pointer :
type * pointer_name;
|
Dimana type merupakan tipe dari
data yang ditunjuk, bukan tipe dari pointer-nya. Contoh :
int * number;
char * character;
float * greatnumber;
Contoh :
// my first pointer
#include <iostream.h>
int main ()
{ int value1 = 5, value2 = 15;
int * mypointer;
*mypointer = 10;
mypointer = &value2;
*mypointer = 20;
cout << "value1==" << value1 << "/
value2==" << value2;
return 0;
}
Output :
value1==10 / value2==20
|
4)
Array
dan Pointer
Identifier suatu array equivalen
dengan alamat dari elemen pertama,
pointer equivalen dengan alamat elemen pertama yang ditunjuk.
Perhatikan deklarasi berikut :
int numbers [20];
int * p;
maka deklarasi dibawah ini juga
benar :
p = numbers;
p dan numbers equivalen, dan
memiliki sifat (properties) yang sama. Perbedaannya, user dapat menentukan
nilai lain untuk pointer p dimana
numbers akan selalu menunjuk nilai yang sama seperti yang
telah didefinisikan. p,
merupakan variable pointer,
numbers adalah constant pointer.
Karena itu walaupun instruksi diatas benar, tetapi tidak untuk instruksi
dibawah ini :
numbers = p;
karena
numbers adalah array (constant pointer), dan tidak ada nilai yang dapat
diberikan untuk identifier konstant (constant identifiers).
|
Contoh :
Output :
// more pointers 10,
20, 30, 40, 50,
#include <iostream.h>
int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}
Inisialisasi
Pointer
Contoh :
int number;
int *tommy = &number;
Equivalen dengan :
int number;
int *tommy;
|
Seperti pada array, inisialisasi isi
dari pointer dapat dilakukan dengan deklarasi seperti conto berikut :
char * terry = "hello";
Misalkan "hello" disimpan
pada alamat 1702 dan seterusnya, maka
deklarasi tadi dapat digambarkan sbb :
‘h’
|
‘e'
|
‘l’
|
‘l’
|
‘o’
|
‘\0’
|
1702
1703 1704 1705 1706 1707
1702
|
Terry
terry berisi
nilai 1702 dan bukan
'h' atau "hello", walaupun
1702 menunjuk pada
karakter tersebut. Sehingga jika akan
dilakukan perubahan pada
karakter 'o' diganti
dengan tanda '!'
maka
ekspresi yang digunakan ada 2 macam :
terry[4] = '!';
*(terry+4) = '!';
Penulisan
terry[4] dan *(terry+4), mempunyai arti yang sama.
5)
Macam-macam
pointer
1)
Pointer
Arithmatika
Contoh,
char memerlukan 1 byte, short memerlukan 2 bytes dan long memerlukan 4.
Terdapat 3
buah
pointer :
char *mychar;
|
long *mylong;
ekspresi diatas
akan menunjuk pada
lokasi dimemory masing-masing 1000, 2000
and 3000,
sehingga
jika dituliskan :
mychar++;
myshort++;
mylong++;
mychar,
akan bernilai 1001, myshort bernilai 2002, dan mylong bernilai 3004. Alasannya
adalah
ketika
terjadi pertambahan maka akan
ditambahkan dengan tipe yang sama
seperti yang didefinisikan berupa ukuran
dalam bytes.
Perhatikan ekspresi dibawah ini :
*p++;
*p++ = *q++;
Ekspresi pertama equivalen dengan *(p++)
dan yang dilakukan adalah menambahkan p
(yaitu alamat yang ditunjuk, bukan nilai yang dikandungnya). Ekspresi kedua,
yang dilakukan pertama
adalah memberikan nilai
*q ke *p
dan kemudian keduanya
ditambahkan 1 atau dengan kata lain :
*p = *q;
p++;
q++;
void
pointer
|
//
integer increaser
#include
<iostream.h>
void
increase (void* data, int type)
{
switch (type)
{
case sizeof(char) : (*((char*)data))++;
break;
case sizeof(short): (*((short*)data))++;
break;
case sizeof(long) : (*((long*)data))++;
break;
}
int
main ()
{
char a = 5;
short b = 9;
long c = 12;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
increase (&c,sizeof(c));
cout << (int) a << ", "
<< b << ", " << c;
return 0;
}
Output :
6, 10, 13
0 komentar:
Post a Comment