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.

Yorumlar

  1. Fatih Kabakci

    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 ?

  2. Şadi Evren ŞEKER Article Author

    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ı.

  3. Fatih Kabakci

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

  4. duygu

    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

  5. Şadi Evren ŞEKER Article Author

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

    umarım yardımcı olur

    başarılar

  6. Şadi Evren ŞEKER Article Author

    kodu test ettim ve çalışıyor. Muhtemelen birşeyleri kaçırıyoruz. Tam olarak hatanın ne olduğunu söylerseniz belki yardımcı olabilirim. Hata mesajını yazabilir misiniz?

  7. ROZERİ
    #include 
    
    void tersYazma(int *a,int s){
    int i=0;
    int tmp=0;
    
    *a=5;
    	for(i=0;i
    

    Hocam merhaba,ben bu kodu yazdım klavyeden girilen sayıları tersten yazdırsın diye,tersten yazdırıyor ama sonra hata veriyor saatlerdir bakıyorum hatamı göremedim yardımcı olursanız cok sevinirim,

  8. Şadi Evren ŞEKER Article Author

    Ben kodunuzu denedim ve hatasız çalıştı 🙂

    Ancak sonra kodunuza baktım, kodunuzda hafıza ayrımı yapılmamış. Dolayısıyla bazı durumlarda hata vermesi mümkün.

    Kısaca eleman sayısı kadar elemanın yerleştirilebileceği bir dizi oluşturmanız gerekiyor. Bunun için de stdlib.h kütüphanesinde bulunan malloc fonksiyonunu kullanmanız gerekir.

    7. satırda ilk değer olarak 5 koymuşsunuz bu bence gereksiz bunun yerine aşağıdaki satırı yazmanız daha doğru olacaktır:

    a = (int*) malloc(sizeof(int) * s);

    Daha detaylı bilgi için kullanmış olduğunuz atıf ile çağırma (call by reference) konusunda aşağıdaki yazıyı okumanızı tavsiye ederim:

    http://www.bilgisayarkavramlari.com/2009/01/12/atif-ile-cagirma-call-by-reference/

    Başarılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir