Pointerlar
ve kullanýmlarý
Yazan :
Þadi Evren ÞEKER
Pointer (gösterici) basitçe bir deðiþkenin bir hafýza alanýný göstermesi
demektir. C dilinde pointerlar:
Veritipi *pointeradi;
Þeklinde tanýmlanýr. Burada veritipi int, char, float
gibi deðiþken tipleridir. Pointer adý ise bir deðiþken
adýnýn taþýmasý gereken özellikleri taþýyan ve tanýmlandýðý scope
(geçerlilik alanýnda) yaþayacak olan deðiþken adýdýr.
Bir deðiþkenin baþýna & iþareti geldiðinde ise bu deðiþkenin adresini
temsil eder. Yani deðiþken hafýzada nereye konulduysa bu konulan yerin adresine
bu iþaret ile ulaþýlabilir.
Örneðin,
int *p;
int a=10;
p=&a;
satýrýndan sonra hafýzada integer
deðer gösteren p isminde bir pointer tanýmlanmýþ
olur. Bunu hafýzda temsili olarak gösterecek olursak:
|
Adres
deðeri |
içeriði |
matýksal ismi |
|
A101 |
|
|
|
A102 |
|
|
|
A103 |
|
|
|
A104 |
|
|
|
A105 |
|
|
|
A106 |
|
|
|
A107 |
A116 |
p |
|
A108 |
|
|
|
A109 |
|
|
|
A110 |
|
|
|
A111 |
|
|
|
A112 |
|
|
|
A113 |
|
|
|
A114 |
|
|
|
A115 |
|
|
|
A116 |
10 |
a |
|
A117 |
|
|
|
A118 |
|
|
|
A119 |
|
|
|
A120 |
|
|
Yukarýdaki temsili resimde, ilk sütun adres deðerlerini temsil
etmektedir, buna göre hafýzanýn a101 ile a120 numaralý adresleri arasýndaki
bilgiler gösterilmiþtir ( bu deðerler hexadecimal
olup temsili olarak yazýlmýþtýr)
Kodda bulunan p ve a deðerlerinin hafýzda hangi bölüme atanacaðý
çalýþtýrma sýrasýnda ( execution time ) belirlenir dolayýsýyla
tam olarak nerede bulunacaðý bilinemez ancak p tanýmlnadýktan
sonra a107 adresine ve a tanýmlandýktan sonra a116 adresinin ayrýldýðýný kabul
edelim. Bu durumda p’nin deðeri a107 numaralý adreste
olacaktýr.
Kodda a deðerine 10 konulmuþtur bu durumda a’nýn
deðerinin durduðu a116 numaralý adreste sayýsal olarak 10 yazacaktýr.
Kodda a’nýn taþýdýðý adres deðeri, p’nin içine atýlmýþtýr. Bu durumda p’nin
deðeri a’nýn adresi olacaktýr.
Aþaðýdaki örnek kodu çalýþtýrýnýz ve yorumlayýnýz:
#include
<stdio.h>
int
main(){
int a=10;
int *p;
p=&a;
printf("%d\n",*p); //
p’nin gösterdiði yeri basar
printf("%d\n",p); // p’nin deðerini yani, p’nin
gösterdiði yerin adresini basar
printf("%d\n",a); // a’nýn deðerini basar
printf("%d\n",&a);
//a’nýn adresini basar
printf("%d\n",&p);
//p’nin adresini basar
}
C dilinde her dizi bir pointer her pointer da doðal bir dizidir.
char str[80], *p1;
p1 = str;
Burada p1, str dizisinin - stringinin
- ilk elamaninin adresinin degerini
alir. Yani string adi, aslinda o stringin hafizadaki baslangiç adresini = stringin ilk karakterinin adresini tutmaktadir.
str dizisinin 5. elemanina erismek için ise;
str[4] veya *(p1+4)
ifadelerini kullaniriz. Her ikisinin de anlami aynidir.
C’de dizi elemanlarina 2 sekilde ulasilir: pointer kullanimi ile ve indis kullanimi ile. Indis kullanimi gelistirme ve anlama bakimindan bir kolaylik saglasa da, hiz önemli bir konu oldugundan C programcilari
genelde dizi erisimini pointer
kullanarak yaparlar. Asagida ayni isi yapan iki
fonksiyon yeralmaktadir:
void
putstr(char *s)
{
int t;
for (t=0; s[t]; ++t) putchar(s[t]);
}
void putstr(char *s)
{
while (*s) putchar(*s++);
}
C dilinde bir pointer’ý array gibi kullanmak için:
int *p = (int *) malloc ( sizeof(int)*10);
þeklinde bir satýr yazmak yeterlidir. Burada klasik dizi tanýmýndan farksýz bir iþlem yapýlmýþ, hafýzada 10’luk bir alan açýlmýþ ve tipi integer olarak tanýmlanmýþtýr.
Pointer’ýn farký bu alana eriþim þeklindedir. Yani dizi tanýmlarýnda olduðu gibi köþeli parantezle (a[3] gibi) eriþmek yerine pointer üzerinde iþlem yapmak gereki ancak yöntem bir önceki örnekte olduðu gibi
printf(“%d\n”,*(p+4)) þeklinde iþleyebilmektedir.