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.