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

Call by pointer – Call by value – Call by referance

 

Bir değişkeni bir fonksiyona yollamak için çeşitli yollar vardır. İhtiyacımıza ve kaynaklarımıza göre call by pointer-value-referance arasından en iyisini seçmek, iyi bir program yazmak için gereklidir.

Call by Value(değer ile çağırma) : Değişkeni fonksiyona değeri ile göndermektir. Bir değişkeni fonksiyona gönderirken, direk kendisini göndermez. Bunun yerine değişkenin bir kopyasını oluşturur. Böylece fonksiyonun aldığı değişkendeki değişiklikler, asıl değişkenimizi etkilemez. Ancak gerçek bir kopyalama yapıldığı için hafızada fazladan yer kaplamış oluruz. Recursive fonksiyonlarda da değişken her yollandırdığında yeniden kopyalanır. Böylece recursive fonksiyonun alt aşamalarında yapılan değişiklikler, üstteki değişkenleri doğrudan etkilemez.

Görüldüğü üzere kopya a’da yapılan değişiklikler gerçek a’yı etkilemedi

 

Call by Reference: Öncelikle referansın ne olduğunu hatırlayalım. Referans, bir değişkene erişmek için yeni bir isim tanımlamak gibi düşünülebilir. Ancak bu bir pointer atama işlemi gibi değildir. Aynı değişkene 2 farklı isimle ulaşmak gibi düşünülebilir. & işaretiyle belirtilsede bu işaretin pointer ile alakası yoktur.

Call by referans işleminde, bu sefer değişkenin kopyasını oluşturmak yerine referansını oluşturup, bu referans ile işlem yaparız. Yapılan şey bir kopyalama değil de, değişkene ulaşmak için yeni bir yol oluşturma olduğu için referans üzerinde yapılan değişiklikler asıl değişkenimizi de etkiler.

Bu sefer asıl a değişkenmiz değişti. Çünkü referans sayesinde a değişkeninin adresine eriştik

 

Referans işlemi gerçek bir kopyalama yapmadığı için hafızada yeni bir yer kaplamaz. Temel tipteki değişkenler hafızada fazla yer kaplamadığı için hafızada fazla bir kazancımız olmayabilir. Ancak diziler yada stringler gibi temel tipte olmayan yapılar çok büyük yerler kaplıyor olabilirler. Eğer içeriğin değiştirilmesiyle ilgili bir endişemiz yoksa büyük yapıları referans yada pointer ile göndermek mantiıklıdır.

Call by pointer: Bu sefer fonksiyona yolladığımız şey, direk fonksiyonun adresidir. Yapılan işlemler bu işaretçi vasıtasıyla adres üzerinden yapılır. Bu yüzden yapılan değişiklikler asıl değeri etkiler.

Görüldüğü gibi aynı şekilde ilk değişkenimiz üzerinden işlemler yapıldı ve sayımız değişti.

 

 

Call by pointer – Call by value – Call by referance, hangisi kullanılmalı?

Referansta direk değişkeni atarız. Pointerda ise değişkenin adresini atarız. Pointer ile çağırmada pointer aritmetiği kullanarak çok daha işlevsel programlar yazabiliriz. Ancak referansları kullanmak çok daha kolaydır. Ayrıca pointerlara göre daha güvenlidir.

Sonuç olarak hangisini seçeceğimiz, ihtiyacımızın ne olduğuna bağlıdır. Eğer pointer aritmetiği gereken bir işlem yapacaksak pointer kullanmak mantıklıdır. Ancak böyle kapsamlı bir işlem yapmayacaksak fazladan yetki vererek güvenlik zafiyeti yaratmaya gerek yoktur. Referans yada değer ile çağırma yapabiliriz.

Aynı şekilde, eğer göndereceğimiz verinin değişmesini istemiyorsak, hafıza endişemiz de yoksa değeri ile çağırmalıyız, yada const olarak tanımlamalıyız. Ancak böyle bir sıkıntımız yoksa, hatta tam aksine değişmesini istiyorsak referans yada pointer ile çağırabiliriz. Böylece hafızadan da tasarruf etmiş oluruz. Temel tiplerde bu hafıza kazancını çok hissetmesek de, özellikle sınıf nesnelerini fonksiyona yollarken bu farkı açıkça görebiliriz.

    Bir cevap yazın

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