Merhaba herkese bugün sizlere pointerları anlamaya çalışırken karşılaştığım bir durumdan bahsedeceğim.Pointerları 1.sınıfta öğrenirken tam anlayamamıştım ama biraz araştırma yapınca Pointer’ları fonksiyon argümanı olarak kullanınca neler oluyor vb. gibi sorularıma cevap buldum.Ve bunu da bir yazı yazarak pekiştirmek istedim.
Resimdeki kod parçacığı hangi değeri döndürecektir sizce ? 40 mı ?.
Hayır dönecek sonuç yine 20 değeridir.Ama sonucun 40 olması gerekmiyor mu? diyor olabilirsin.
Sebebine gelecek olursak.MultiplyByValue() fonksiyonuna parametre olarak geçilen value değişkeni local bir değişkendir.Bu süreci stack ile anlatmak olayı açıklığa kavuşturacaktır.
MultiplyByTwo() fonksiyonu gerekli değişikliği kendi scope(kapsam)’u içindeki value değişkeni üzerinde yapar.İşlem bittikten sonra MultiplyByTwo() fonksiyonunu içeren Stack frame , Stack’ten silinir.Alttaki Stack frame’e geçildiğinde ise MultiplyByTwo fonksiyonunun main() fonksiyonu içerisindeki değişken üzerinde bir etkisi olmaz.
NOT: Eğer MultiplyByTwo() fonksiyonu içerisinde başka bir fonksiyon ve bu fonksiyon içerisinde başka bir fonksiyon olma gibi zincirleme bir durumda Stack Overflow hatası fırlatacaktır.
Peki yukarıdaki durumu nasıl çözeriz ? Bu işlemi Pointer kullanarak çözebiliriz.
Resimdeki gibi parametreyi pointer olarak değiştirip ilgili işlemleri fonksiyon içerisinde yaparız.
Ardından fonksiyonun çağrıldığı yerde ,fonksiyona parametre olarak &a yani a’nın hafızadaki adresini göndeririz.MultiplyByTwo()fonksiyonu ise gelen bu adresi int*(integer to pointer) kulllanarak dereferencing işlemi yapar ve değişkenin adresteki değerine ulaşır ardından modify işlemini gerçekleştirir.Bu işleme ise Call by Reference adı verilir.
Evet arkadaşlar bugünki konunun uzunluğu bu kadar.Sizin bildiğiniz veya hemen cevap vereceğiniz bir soru olabilir.Ama ben konuyu anladığım için mutlu oldum.Ayrıca bu yazı ile pekiştirmiş oldum.Yanlış gördüğünüz veya eklemek istediğiniz şeyler olursa bana ulaşabilirsiniz.Gerekli düzeltmeleri yapmaktan mutlu olurum.
Sonraki yazılarda görüşmek üzere sağlıcakla.Keep learning :)