hafiza adresini tutan degi$ken tipi. mesela a degi$keni hafizada 10 adresinde tutuluyorsa a'yi gosteren tum pointer'larin degeri 10 olur. o adreste varolan verinin tipi ya da icerigi bu durumu degi$tirmez.
pointer kullanmanin suruyle avantaji vardir. mesela koca koca hafiza bloklarini oradan oraya ta$imak yerine o sirada cali$tiginiz blogu gosteren bir pointer'in adresini degi$tirip durursunuz. hafizada bir $eyleri ta$imaniz gerekmez.
hafiza adresleri sistemin teoride adresleyebilecegi maksimum hafizaya gore degi$ebildiginden 16-bit, 32-bit ve 64-bit platformlarda pointer'larin geni$ligi buna uygun olur.
8086 tabanli 16-bit sistemlerde bir hafiza 16-bit segment ve 16-bit offset ciftiyle gosterilebildiginden
far pointer adi verilen ozel bir tur 32-bit (yani 4-byte) yer kaplar. (bkz:
mk_fp)
pointer'in guven sorunu vardir zira bir pointer'in gosterdigi adreste pointer'in gosterdigi tipte gecerli bir degi$ken oldugunun garantisi yoktur. o adreste ne varsa o tipte bir degi$ken farzedilir. bu hatali kodlarin sorun yokmu$casina cali$masina ve beklenmedik anlarda cokmesine kapi aralar.
.net ve java bu sorunu pointer'i kaldirip yerine
reference adi verilen icerigi degi$mez, tip guvenli ve referans sayan veri tipleriyle cozmu$lerdir.
.net'te illa pointer kullanacagim derseniz
unsafe kodu gecerli kilarak bunu yapmaniz mumkun. java'yi bilmiyorum.
c'de pointer'lar "*" tip sonekiyle tanimlanir. misal:
int i; // tam sayi bir degi$ken
int* i; // tam sayi bir degi$kenin hafizadaki yerini gosteren pointer
int** i; // tam sayi bir degi$kenin yerini gosteren pointer'in yerini gosteren pointer
int*** i; // ebenin ami ali sami
a ve b diye iki tane tamsayi degi$ken bi tane de p diye pointer'imiz olsun.
int a;
int b;
int* p;
a = 3;
b = 5;
p = &a; // p a'nin adresini gostersin diyoruz. eger a'nin adresinin mesela hep 15 nolu adreste olacaginin garantisi olsaydi p = 15 de diyebilirdik. ama oyle bir garanti yok.
printf("%d\n", p); // ekrana p'nin degerini yani a'nin adresini yazar bu her seferinde degi$ebilir, genelde buyuk bir sayidir (3272373 gibi)
p = &b; // p $imdi de b'nin adresini gostersin
printf("%d\n", p); // ekrana bu sefer b'nin adresini yazar (bu muhtemelen a'nin adresinin 4 fazlasi olacaktir)
printf("%d\n", *p); // ustteki satirla farka dikkat. bu sefer p'nin gosterdigi adresi degil, p'nin gosterdigi adresteki tamsayinin degerini yaziyoruz. p b'nin adresini gosterdiginden ekrana "5" yazacaktir. tekrar p=&a; deyip ayni kodu cali$tirsaydik ekrana 3 yazacakti.
gelecek sayida: c bir pointer dili midir?