Bu sayfadaki yazılar
Sayfanın metni
Sayfa 64
POINTER KAVRAMI:
Pointer işlemleri, C dilinde geniş olarak kullanılmakta ve Düşük Seviye Dilleri (Low Level Language) ile yapılabilen birçok işlemi de bu sayede yerine getirmektedir. Daha önceki yazı dizilerini izlediyseniz, kullanılan değişkenlerin tipinin belirlendiğini ve bunun gerekli olduğunu görmüşsünüzdür. Çünkü derleyici program bellekte değişken tipine göre yer ayırmaktadır. Örneğin “char” ile tanımlanmış değişkenlerde 1 bayt, “double” ile tanımlanmış değişkenlerde 4 bayt yer ayrılmaktadır. Eğer değişken bir diziyse o dizinin eleman sayısı ile tipinin çarpımı kadar yer ayrılmaktadır. Bunu şekil ile gösterelim:
1 Bayt 1 Bayt char ala Pa 4 rm ac) 5 as) char bi b Pb * ae) double c Pc * C2 3
Şekilde örnek olarak a, b, c değişkenleri ile dizisinin bellekte sıralanışı gösterilmiştir. Şeklin sağında p ile gösterilen ifade o değişkenin bellekteki konumunu belirten POINTER ifadesidir. Yani a değişkeninin belirtilmesinin bir yolu da bellekteki konumunun bilinmesidir. a değişkeninin bellekteki yeri Pa olduğunda biz a değerini *Pa ile elde edebiliriz. (*) gösterimi Pa pointer'ın içeriğini ifade etmektedir. Benzer şekilde *Pb ve *Pc de sırasıyla b ve c değişkenini göstermektedir. C değişkeninin double olması nedeniyle Pc pointer'ı C1 değerini referans almaktadır. Doğal olarak pointer doğrudan değişken tipine bağlı olmaktadır.
char *pa double *pc
ifadeleri Pa ve Pc'nin pointer değişkeni olduğunu göstermektedir. Gerektiği durumda değişkenin pointer'ının yerini de bulmamıza yarayacak ve bunu işlemcinin adresi cinsinden verebilecek & gösterimini kullanabiliriz. Bu durumda:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 65
Pa—&, Pc—&c olmaktadır. Bunun tersi ise a — *Pa, *Pc'dir.
POINTER VE DİZİLER:
Pointer işlemini diziler üzerinde incelersek bize büyük kolaylıklar sağlayan kullanımlar görürüz. Çünkü dizilerin elemanlarını ifade etmek için pointer kullanmak hem işlemleri hızlandırır, hem de kullanılacak elemanın yeri tek bir pointer ile belirlenmiş olur.
Örnek olarak: Char a[10] dizisinin pointer'ını bulalım. Bunun için önce, char *Pa ile pointer değişkenini tanımlayalım, sonra da Pa = &a[0] ile Pa'yı belirleyelim. Pa belirlendikten sonra istediğimiz elemana kolayca erişebiliriz. Örneğin dizinin ilk, beşinci ve üçüncü elemanına sırayla ulaşalım:
0. eleman *Pa 5. eleman Pa = Pa + 5 ve *Pa 3. eleman Pa = Pa - 2 ve *Pa
Görüldüğü gibi dizi elemanlarını basit matematiksel işlemler yardımıyla elde edebilmek mümkün. Bu pointer işleminin sağladığı büyük olanaklardan biridir. Örnek olarak The C Programming Language adlı kitapta yer alan bir diziyi diğerine kopyalamaya yarayan strcpy() fonksiyonunun normal ve pointer kullanarak tasarlanmış şekillerini verebiliriz:
strcpy(s,t) char ınt İ; while ((sli) —tfil ! — *0”) i4 4
Bu örnekte dizi elemanları i değişkeni ile belirlenmekte ve her defada i arttırılarak dizinin son elemanına kadar işlem tekrarlanmaktadır. Programdan anlaşılacağı gibi dizinin son elemanının hemen arkasından “ ” gelmektedir. Bu derleme sırasında derleyici tarafından konmaktadır. Aynı işlem pointer kullanılarak şu şekilde yapılabilir.
strcpy(s,t) char *s, *t while (*s >» 4)
,
Burada (*) işleminin * pointer işleminden öncelikli olduğuna dikkat ediniz. Ayrıca while işleminin parantez içindeki ifadenin 0 olana kadar devam ettiğini ve dizilerin sonunda 0 olduğunu hatırlayınız. Pointer'lar hakkında daha geniş bilgi için The C Programming Language adlı kitabın 5. bölümüne bakabilirsiniz.