İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

POINTER

POINTER NEDIR?

Basitce, pointer, bir adrestir. Bir degisken olmak yerine, bir degiskenin hafizadaki adresini tasiyan bir 'ok isareti'dir.

Göster Gizle Kopar Satır Gizle Satır Göster
main() /* Pointer kullanimi ornegi */
{
int index,*pt1,*pt2;

index = 39; /* herhangi bir deger */
pt1 = &index; /* 'index' in adresi */
pt2 = pt1;

printf("Deger simdi %d %d %d dir.\n",index,*pt1,*pt2);

*pt1 = 13; /* 'index' in degerine degisiklik yapalim */

printf("Degistikten sonra ise %d %d %d\n",index,*pt1,*pt2);
}

Su an icin, programin index degiskenini ve iki tane astrisk ile baslayan terimlerin tanimlandigi yere bakmayin. Aslinda astrisk denilen bu isarete, biz simdilik 'yildiz' diyelim.

Programda ilk once, index degiskenine 39 degerini atiyoruz. Bunun altindaki satirda ise, pt1'e tuhaf bir deger atanmasini goruyoruz - index degiskeni, ve onunde bir & ampersand isareti ile. Bu ornekte, pt1 ve pt2 pointer dir, ve index de basit bir degiskendir. Simdi bir problemle karsi karsiyayiz. Bu programda pointer kullaniliyor, fakat nasil kullanilacagini ogrenmedik.

Bu gorecekleriniz biraz aklinizi karistiracak, fakat bunlari anlamadan gecmeyin.

İKİ ÖNEMLİ KURAL

HAFIZA YARDIMCISI

pt1 ve pt2 pointer olarak, kendileri bir deger tasimazlar, fakat bellekteki bir adresi gosterirler. Bu programda, 'index' degiskenini gosteren pointer'lar oldugu icin, degiskenin degerini hem index ile, hemde onun adresini tasiyan pointer'lar ile degistirebiliriz.

Dokuzuncu satirda, index degiskeninin degeri, pt1 pointer'i ile degistiriliyor. Program icinde 'index' i kullandigimiz herhangi biryerde, (pt1 baska birseye atanincaya kadar), '*pt1' i de kullanmamiz mumkundur, cunku pt1, index'in adresini tasimaktadir.

BIR BASKA POINTER

Programa degisklik katmak icin, birbaska pointer daha tanimladim. "pt2" isimli bu pointer, yedinci satirda "pt1"'in tasidigi adresi almaktadir. Bu atamadan once, ayni henuz deger atanmamis degiskenler gibi icinde rastgele bilgiler vardir. Bundan sonra, "pt2" de "index" degiskeninin adresini tasimaktadir. Ornegin, dokuzuncu satirda "*pt1" i "*pt2" ile degistirsek de, sonuc ayni olacaktir - cunku iki pointer da ayni adresi tasimaktadir.

SADECE BİR DEĞİŞKEN

Bu programda uc tane degisken var gibi gorunse de, aslinda bir tane degisken tanimlidir. Iki pointer ise, bu degiskenin adresini tutmaktadir. Bu durum, "printf" komutunun hep 13 degerini yazmasindan da anlasilabilir.

Bu gercekten anlamasi zor bir kavramdir, fakat en kucuk C programlari disinda hepsi tarafindan kullanildigi icin, ogrenmeniz gereklidir.

POINTER NASIL TANIMLANIR

Programin ucuncu satirinda, ilk once "index" isimli degisken tanimlanir, daha sonra da iki tane pointer tanimlamasi goreceksiniz. Ikinci tanim, su sekilde okunabilir: "pt1'in gosterecegi adres, bir tamsayi degiskenine ait olacak." Yani, "pt1", tamsayi bir degiskeninin pointer'i olur. Ayni sekilde, "pt2" de, yine bir tamsayi degiskeninin pointer'i olur.

Bir pointer, bir degiskenin adresini tasimak icin tanimlanir. Tanimlandigindan baska bir degisken tipi icin kullanimi "uyumsuz veri tipi" hatasinin olusmasina sebep olur. Ornegin, "float" tipi bir pointer, "int" tipli bir degiskenin adresini alamaz.

POINTER'LI İKİNCİ PROGRAMIMIZ

Göster Gizle Kopar Satır Gizle Satır Göster
main()
{
char katar[40],*orada,bir,iki;
int *pt,list[100],index;

strcpy(katar,"Bu bir karakter kataridir.");

bir = katar[0]; /* bir ve iki ayni degeri tasirlar */
iki = *katar;
printf("Ilk cikti %c %c\n",bir,iki);

bir = katar[8]; /* bir ve iki ayni degeri tasirlar */
iki = *(katar+8);
printf("Ikinci cikti %c %c\n",bir,iki);

orada = katar+10; /* katar+10 ve katar[10] aynidir. */
printf("Ucuncu cikti %c\n",katar[10]);
printf("Dorduncu cikti %c\n",*orada);

for (index = 0;index < 100;index++)
list[index] = index + 100;
pt = list + 27;
printf("Besinci cikti %d\n",list[27]);
printf("Altinci cikti %d\n",*pt);
}

Bu programda, iki tane pointer, iki tane dizi ve uc tane degisken tanimliyoruz. "orada" isimli pointer, karakter tipi, ve "pt" ise, tamsayi tipindedir.

BİR KATAR DEĞİŞKENI ASLINDA BİR POINTER DIR

C programlama dilinde, bir katar degiskeni, o katarin baslangicini gosteren bir pointer olarak tanimlanmistir. Programda bir bakin: once "katar" isimli diziye sabit bir katar atiyoruz. Daha sonra, "bir" isimli degiskene, "katar" in ilk harfini atiyoruz. Sonra, "iki" isimli degiskene, ayni degeri atiyoruz. Ikinci satirda "*katar[0]" yazmak yalnis olurdu, cunku yildiz isareti, koseli parantezlerin yerini almaktadir.

"katar" i neredeyse tam bir pointer gibi kullanabilirsiniz, yegane farki, tuttugu adres degistirilemez, ve daima o katarin baslangic adresini gosterir.

Onkinci satira gelince, katarin dokuzuncu karakterinin (sifirdan basladigimiz icin), iki ayri sekilde "bir" ve "iki" isimli degiskenlere atandigini goruyoruz.

C programlama dili, pointer'in tipine gore, index ayarlamasini otomatik olarak yapar. Bu durumda, "katar" bir "char" olarak tanimlandigi icin, baslangic adresine 8 eklenir. Sayet "katar" "int" (tamsayi) olarak tanimlanmis olsa idi, index iki ile carpilip, "katar" in baslangic adresine eklenirdi.

"orada" bir pointer oldugu icin, 16. satirda "katar" in 11. elemaninin adresini tasiyabilir. "orada" gercek bir pointer oldugu icin, herhangi bir karakter degiskeninin adresini gosterebilir.

POINTER VE ARİTMETİK

Her cesit islemler, pointer'lar ile mumkun degildir. Pointer bir adres oldugundan, ona bir sabit rakam ekleyip, daha ilerideki bir adrese erismek mumkundur. Ayni sekilde, pointer'in adresinde bir rakam cikartip, daha onceki hafiza bolgelerine erismek mumkundur. Iki pointer'i toplamak pek mantikli degildir, cunku bilgisayardaki adresler sabit degildir. Cikacak rakamin tuhaf olacagi icin pointer ile carpma da yapilamaz. Ne yaptiginizi dusunurseniz, yapabilecekleriniz ve yapamayacaklariniz kendini belli edecektir.

TAMSAYI POINTER'I

"list" isimli tamsayi dizisine, 100 den 199 a kadar degerler verilir. Daha sonra, 28. elemanin adresini, "pt" isimli pointer'a atiyoruz. Daha sonra ekrana yazdigimizda, gercektende, o degeri aldigini goruyoruz.

Daha onceki konularda, bir fonksiyondan veri degerlerini dondurmek icin iki metod oldugunu soylemistim. Ilki, bir dizi kullanarakti. Ikincisini herhalde tahmin edersiniz. Sayet tahmininiz "pointer sayesinde" idiyse,tebrikler.

Göster Gizle Kopar Satır Gizle Satır Göster
main()
{
int cevizler,elmalar;

cevizler = 100;
elmalar = 101;
printf("Baslangic degerleri %d %d\n",cevizler,elmalar);

/* "degistir" i cagirinca, */
degistir(cevizler,&elmalar); /* cevizlerin DEGERI ve, */
/* elmalarin adresini geciriyoruz */

printf("Bitis degerleri ise, %d %d dir..\n",cevizler,elmalar);
}

degistir(kuru_yemis,meyvalar) /* kuru_yemis tamsayidir */
int kuru_yemis,*meyvalar; /* meyvalar bir tamsayi pointer'idir */
{
printf("Degerler %d %d\n",kuru_yemis,*meyvalar);
kuru_yemis = 135;
*meyvalar = 172;
printf("Sonraki degerler %d %d\n",kuru_yemis,*meyvalar);
}

Burada, iki tane tamsayi degiskeni (pointer degil) tanimliyoruz: "cevizler" ve "elmalar". Once bunlara birer deger atiyoruz, ve "degistir" isimli fonksiyonu cagiriyoruz. Cagirirken, "cevizler" in degeri (100), ve "elmalar" degiskeninin adresini geciriyoruz. Fakat, fonksiyona da, bir deger ve bir adres gelecegini haber vermemiz gereklidir. Bunun icin, fonksiyonun parametreleri tanimlanirken, bir adres tasiyacak olan sembolun basina bir yildiz koymamiz yeterlidir.

Fonksiyonun icinde, bu iki degeri degistirip, eski ve yeni degerleri ekrana yaziyoruz. Bu program calistiginda, ana programdaki "cevizler" in degerinin ayni kaldigini fakat "elmalar" in yeni degerlerini aldigini goreceksiniz.

"cevizler" in degerinin ayni kalmasinin nedeni, fonksiyona bir deger gecirildiginde, C dilinin o degerin bir kopyasini fonksiyona gecirmesi yuzundendir. Programa geri dondugunuzde, degerin bir kopyasini kullandigimiz icin asil degerin degismedigini goreceksiniz.

"elmalar" in degerinin degismesi ise, yine fonksiyona "elmalar" degiskeninin adresinin bir kopyasi gecirildigi halde, bu adres ana programdaki "elmalar" a karsilik geldigi icin, fonksiyonda bu adresteki degeri degistirir degistirmez, "elmalar" in da degeri degismis olur.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır