Pointer ( gösterici )


Programlama dillerinin bazılarında olan bir hafıza alanını işaret etmeye yarayan değişken tipdir. Buna göre örneğin C dilinde tanımlanan bir değişken, yine aynı değişkeni gösteren bir pointer ile de erişilebilir hale gelmiş olur.

int *p;
*p=5;
printf(”%d %d %d “,p,*p,&p);

yukarıdaki C/C++ kodu çalıştırılacak olursa sırasıyla,
p’nin gösterdiği yerin adresini (5 değerinin hafızada saklandığı alan)
p’nin gösterdiği yerdeki değeri (5)
p’nin hafızadaki alanını
ekrana basar.

Bilindiği gibi C++ gibi melez (hem C hem de nesne yönelimli programlamayı destekler) diller dışında JAVA, C# gibi dillerde gösterici (pointer) bulunmaz. Bunun yerine nesne göstericisi (object referrer) bulunur. Bu değişken tipleri esas olarak bir sınıf(Class)‘dan türetilmiş bir nesneyi(object) gösterebilen değişkenlerdir. Bu değişkenlerin aslında birer göstericiden farkı yoktur.

Buna göre nesne yönelimli bir programlama dilinde aşağıdaki örnekte gösterildiği üzere bir gösterici kullanımı mümkündür:
class kutu{
int veri;
kutu next;
}
// görüldüğü üzere yukarıdaki kodda kendi tipinden bir objeyi gösteren (refer eden) bir gösterici kodlanmıştır.
class liste{
kutu head;
public void ekle(int deger){
head = new kutu();
head.veri = deger;
}
}
// yukarıdaki kodda yeni bir kutu oluşturulup değer olarak bu kutuya verilen parametre konulmuştur.

Örnek

Bir dizinin tersini alan kodu, gösterici matematiği (pointer arithmetic) kullanarak kodlayalım.

Amacımız verilen bir dizinin tersini almak. Dolayısıyla dizinin bir başını bir de sonunu gösteren iki gösterici kodlar ve bu göstericilerin içerisindeki değerlerin yerini değiştirerek ortaya doğru ilerletirsek amacımıza ulaşırız.

Örneğin dizimi 1,2,3,4,5 sayılarından oluşsun. Bu durumda göstericilerin ilk konumunda, birisi 1 diğeri de 5 değerini gösterecek. Gösterieilerden baştaki elemanı gösterene p, ve sondaki elemanı gösterene q dersek aşağıdaki şekilde sorunun çözümünü düşünebiliriz:

Yukarıdaki şekilde gösterildiği üzere iki uçtan birer gösterici (pointer) ile başlayarak her adımda bu göstericilerin içeriğini yer değiştiren (swap) ve göstericileri merkeze doğru hareket ettiren kod, aşağıdaki şekilde yazılabilir:

Kodun çıktısı aşağıda verilmiştir:

Yukarıdaki kodun 8. satırında bulunan döngü sadece 3 elaman için dönmektedir. Bunun sebebi dizinin ortasına kadar göstericilerin hareket ettirilmesidir. Ayrıca 9-11. satırlar arasında yer değiştirme işlemi (swap yapılmakta ve 12,13. satırlarda da göstericiler merkeze doğru hareket ettirilmektedir. Burada q göstericisinin sola , p göstericisinin ise sağa gitmesi için q’nun değeri azaltılırken, p’nin değeri arttırılmıştır.


« Static Scoping ( Sabit Alanlı Değiþkenler )   |   Linked List (Linkli Liste veya Bağlı Liste) »



Yorumlar

Kullanıcı girişi yaparak ya da zorunlu olan * alanlarını doldurarak yorum yapabilirsiniz.

İsminiz *

Email adresiniz *

Web siteniz

Mesajınızı buraya yazabilirsiniz:

Toplam 6 yorum var.

  1. bilgisayar.kavramlari.com » Linked List (Linkli Liste veya Bağlı Liste) | 03 May 2007, 02:50

    [...] etmesi (point) ile oluşan zincire verilen isimdir. Buna göre her düğümde kendi tipinden bir pointer olacak ve bu pointerlar ile düğümler birbirine aşağıdaki şekilde [...]

  2. Fatih Kabakci | 28 Dec 2009, 02:04

    int a[]={1,2,3,4,5};
    int *p=a;
    int *q=a+4;
    for(int i=0;i<3;i++){
    int temp=*p;
    *p=*q;
    *q=temp;
    q–;
    }
    for(int i=0;i<5;i++){
    printf("%d ",a[i]);
    }
    hocam bu kodun cıktısı 3 2 4 5 1 olarak veriyor.sizce dogrumu?dogruysa,ilk dongudeki i nin 0 dan 3 e kadar gitmesinin mantıgı nedir ?

  3. Şadi Evren ŞEKER | 28 Dec 2009, 04:12

    Yukarıdaki kodunuzda, eksik ve hatalı satırlar var. Düzelterek yazının içerisine doğrusunu ekliyorum. Kodun yazılış amacı bir dizinin tersini gösterici matematiği (pointer arithmetic) ile alması.

  4. Fatih Kabakci | 28 Dec 2009, 15:45

    Hocam cok tesekkur ederim hatayı simdi gordum kodda ki suphemi tescilledim.hayirli calimalar hocam saygilarimla..

  5. duygu | 05 Jan 2010, 20:31

    int main(){
    int a[]={2,4,8,7,3};
    int *p=a;
    int*q=a+4;
    for(int i=0; i<3;i++){
    int temp=*p;
    *p=*q;
    *q=temp;
    p++;
    q–;
    }
    for(int i=0;i<5;i++){
    printf("%d",a[i]);
    getch();
    return 0;
    hocam hata veriyo bu kod yardımcı olursanız sevinirm

  6. Şadi Evren ŞEKER | 06 Jan 2010, 04:43

    kodun çalışan hali yazının içinde bulunuyor.

    umarım yardımcı olur

    başarılar

Bu Yazı Hakkında

Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Pointer ( gösterici )' isimli yazı 03 May 2007 tarihinde, saat: 02:41 'de �adi Evren �EKER tarafından gönderilmiş, toplam 772 defa okunmuştur.

Benzer yazıları Bilgisayar Kavramları, C/C++, Programlama Dilleri kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


Yazarın Kitabı

Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
Yapılan Son Yorumlar
Yakın Yazılar
Bağlantılar