Bu yazıda bildiğim kadarıyla pointerleri C++ ile ele alacağım. Pointerler son derece önemli bir konu olup her yazılımcının bilmesi gerekir. Bellek yönetiminde pointer büyük önem taşır. Sektörde pointer bilmeyene yazılımcı demezler 🙂 🙂 🙂
Bilgisayarların bellekleri milyarlarca hücreden (cell) oluşur. Her hücre 1 byte(8 bit) büyüklüğündedir. Örneğin int tipinde bir değişken 4 byte yer kaplar. Örnek olması açısından bellekteki 1000-1001-1002-1003 konumlarını işgal ederek verdiğimiz değişkeni depolar.
Pointer değişkenin depolandığı hücrenin adresini belirtir. Genelde memory’den tasarruf etmek için pointer kullanılır. Alttaki Call by referance ve value örneklerinde daha iyi anlayacaksınız. Örneğin bir fonksiyona parametre olarak 20 elemanlı dizi verelim, bu verdiğimiz dizi ram’de ayrı bir bölgeye kopyalanır ve işlemler kopyalanan yeni dizide yapılır. Bu bize memory israfı yaratıyor. Eğer ki ben dizinin adresini parametre olarak verirsem bellekte artık yeni klon dizi oluşturulmayacak ve pointer neyi işaretlerse işaretlesin işlemci mimarisine göre 4 veya 8 byte kapladığından dolayı alandan tasarruf edeceğim. Ek olarak pointer’lerin GC(Garbage Collector) olmayan dillerde daha çok kullanıldığını belirtmem gerek, pointerin amacı zaten çöp olusturmayı minimize etmek olduğu için GC olan dillerde pek de gerek kalmıyor pointerlere. Öncelikle int tipinde bir değişken tanımlayalım.
int main()
{
//pointer bellekteki değişkenin adresini taşıyan değişkendir.
int a = 5;
int* pointer = &a;
cout << "Değişkenin adresi " << &a << endl;
cout << "Değişkenin adresi " << pointer << endl;
//Bu iki debug'da aynı adresin yazıldığını göreceksiniz.
cout << "Değişkenin değeri " << *pointer << endl;
*pointer = 7;
//Tanımladığımız pointer'e tekrardan * ile yazarsak artık adresini depoladığı hücreye erişimimiz olacaktır. Bu şekilde depoladığı adresin içindeki değeri değiştirebiliriz.
cout << "a degiskeninin yeni adresi " << a<<endl;
return 0;
}
Pointer konusunda iki farklı kavram ortaya çıkıyor, bunlar Call By Value ve Call By Referance. Bu iki kavrama göz atalım.
void Degistir(int newValue) {
newValue = 20;
cout << "FONKSİYON İÇİNDEKİ DEĞER " << newValue << endl;
}
int main()
{
setlocale(LC_ALL, "Turkish");
//pointer bellekteki değişkenin adresini taşıyan değişkendir.
int a = 5;
cout << "A DEĞİŞKENİNİN DEĞERİ " << a << endl;
Degistir(a);
cout << "FONKSİYON BİTTİKTEN SONRA A DEĞİŞKENİNİN DEĞERİ " << a << endl;
return 0;
}
Yukardaki bu kodlar Call By Value örneğidir. Fonksiyona değiştirmesi için bir veri veriyoruz fakat fonksiyon çalışmaya başladığı anda bellekte farklı boş bir konumda newValue oluşturuyor ve onun değerini 20 olarak atıyor. Son durumdaki ekran çıktısını paylaşıyorum;

void Degistir(int *newValue) {
*newValue = 20;
cout << "FONKSİYON İÇİNDEKİ DEĞER " << *newValue << endl;
}
int main()
{
setlocale(LC_ALL, "Turkish");
//pointer bellekteki değişkenin adresini taşıyan değişkendir.
int a = 5;
cout << "A DEĞİŞKENİNİN DEĞERİ " << a << endl;
Degistir(&a);
cout << "FONKSİYON BİTTİKTEN SONRA A DEĞİŞKENİNİN DEĞERİ " << a << endl;
return 0;
}
Bu ise Call By Referance örneğidir. Fonksiyona benim değiştirmek istediğim değişkenin adresini veriyorum. Call By Value’deki gibi bellekte yeni bir değişken üretmiyor, benim verdiğim değişkenin adresini kullanarak doğrudan değiştiriyor. Böylece Pointer’in kullanım alanına bir örnek vermiş olayım.