"Enter"a basıp içeriğe geçin

Pointer

Pointer nedir

Pointer, hafızadaki bir adresi gösteren işaretçidir. Değişkenlerin yada başka yapıların adreslerini göstermek için kullanılabilirler. Aslında içinde adres tutan bir değişken gibidir diyebiliriz.  Pointerlar değişkenin ilk adresini gösterir, ve tıpkı değişkenmiş gibi kullanılmalarını sağlarlar. Pointerlar da hafızada bir adreste tutulurlar. 

Pointerların da veri tipleri vardır. Mesela bir integer pointer, değişkenin başlangıç adresinden itibaren 4 bayt yeri ifade eder. Bir örnek ile gösterelim

a ve b değişkenleri birer integer, c bir char ve d bir double. ptr1 pointerının içinde 1000 adresi yazıyor. integer pointer olduğu için başlangış adresinden itibaren 4 bayt yeri ifade ediyor. Bu da a değişkenine denk geliyor. Aynı şekilde b pointerı 1004-1008 arasını, c pointerı 1008-1009 arasını, d pointerı da 1009-1017 arasını işaret ediyor.

Pointerların mantığını anladıysak, kodlamada nasıl kullanıldığına bakabiliriz.

Pointer kullanımı

Pointer kullanımında 2 önemli işaret vardır. Bunlar * ve &işaretleridir.
& bir değişkenin hafızadaki yerini temsil eder, * işareti ise pointer’ın gösterdiği değer demektir.
Pointerlar aynı değişkenler gibi tanımlanır.  tip *ad = &değişken

00D5F80C  :  ptr1’in içi yani a değişkeninin adresidir
123456       : a değişkeninin değeridir.
00D5F7D8 : ptr1’in adresidir.

 

Pointerların da hafızada bir adresleri olduğunu ve değişken gibi davranabiildiklerini söyledik
Bu durumda cout << ptr1; dersek, ptr1’in içindekini yani a değişkeninin adresini yazdırır.
cout << *ptr1; dersek, içindeki adresin gösterdiği değeri, yani a değişkenini yazdırır.
Pointerın da hafızada biir yeri olduğuna göre, cout << &ptr1; diyerek bu adresi yazdırabiliriz.

Ayrıca 

 

Pointer ve diziler

Pointerlar üzerinde aritmetik işlemler yapılabilir. Mesela ptr adında, 1000 konumunu gösteren bir integer pointerımız olsun. ptr++ dersek, türü integer olduğu için adresi 4 arttırır ve 1004 konumunu göstermeye başlar.

Dizilerin bitişik hafıza blokları olduğunu söylemiştik. Yani hafızada yan yana dururlar. Dizinin adı, aslında dizinin ilk adresini gösteren bir pointerdır. Yani dizi[0] = *dizi diyebiliriz.

Bu durumda dizi+1 de dizinin 1. İndexini gösterir. Yani dizi[1] = *(dizi+1) olur.
Aynı mantıktan, Yani dizi[i] = *(dizi+i) diyebiliriz.

Pointer aritmatiği

Pointerlar üzerinde ++ gibi aritmatik işlemlerin yapılabildiğini görmüştük. Bunu biraz daha örneklendirelim.

Görüldüğü gibi, aritmatik operatörler kullanarak 

 

 

 

c++ dili hafızaya direk müdahele edebildiği için çok güçlü bir dildir. Ama bu yetki tehlikelere yol açabilir. Bunun için çıktının son satırına bakmamız yeterlidir. Pointer dizinin ilk adresini gösterirken 6 arttırdık. Bu durumda 6. indeksi göstermesi beklenir. Ama öyle bir adres dizimizde yok. Yani adres var, ama diziye ait değil. Hatalı bir adrese erişmiş olduk. Bu adres daha önce kullanılmamış boş bir adres olabileceği gibi, programımıza ait başka bir veriye de ait olabilir. Eğer bu adresteki veriyi bozacak bir işlem yaparsak büyük hatalara yol açabilir. Bu yüzden pointerlar ile oynarken yanlış bir adrese erişmemeye dikkat etmeliyiz.

Pointerın pointerı

Pointerların da bir adreste tutulduğunu söylemiştik, bu durumda onları gösteren pointerlar da oluşturabiliriz.

Call by pointer

Normalde bir fonksiyona değişken yollarken, değişkenin kendi üzerinden değil de bir kopyasının üzerinden işlem yapıyordu. Bu durumda asıl değişkenimiz fonksiyondaki değişikliklerden etkilenmez. Ayrıca fazladan kopyalama maliyeti olur.

Eğer fonksiyon içindeki değişikliklerin değişkenimizi etkilemesini istiyorsak ve kopyalama maliyeti olmasın diyorsak, call by pointer yöntemini kullanabiliriz.

a değişkeninin adresi fonksiyona yollandı, ptr pointerına kopyalandı ve  işlemleri yaptı. Yapılan işlemler a değişkeninin adresi üzerinden yapıldığı için değişiklikler a değişkenini etkiledi

Call by value ve Call by pointer ile ilgili detaylı bilgi için bu yazıma bakabilirsiniz

Fonksiyon pointerları

Değişkenler gibi fonksiyonlar da hafızada tutulur. Bu durumda fonksiyonlar da pointerlar ile tutulabilir. Ama fonksiyon pointerları değişkenlerden farklı şekilde tanımlanır.

Fonksiyon pointerına imzası uygun olan herhangi bir fonksiyon atanabilir. Bu sayede farklı fonksiyonlara aynı isimle ulaşabiliriz

    Bir cevap yazın

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