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.
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 ?
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ı.
Hocam cok tesekkur ederim hatayı simdi gordum kodda ki suphemi tescilledim.hayirli calimalar hocam saygilarimla..
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
kodun çalışan hali yazının içinde bulunuyor.
umarım yardımcı olur
başarılar
bende öyle yaptım amahata verdi ne yapaccağımı bilmiyorum
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?
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