Yazan : Şadi Evren ŞEKER
Programlama dillerinde, fonksiyon çağırma işlemi sırasında kullanılan yöntemlerden birisidir. Farklı kaynaklarda atıf geçirme ( pass by reference ) olarak da geçmektedir. Genelde bir programlama dilinin standart çağrıma yöntemi değer ile çağırmadır (call by value) ancak gösterici (pointer) desteği olan dillerde bu standart çağırma yöntemine ilave olarak atıf ile çağırmak da mümkündür.
Bu yöntemde fonksiyona parametre (argüman) olarak bir değer geçirmek yerine bir gösterici (pointer) referansı geçirilir. Dolayısıyla fonksiyonun içindeki bir yerel değişken (local variable), fonksiyonun çağrıldığı yerdeki bir değeri göstermiş olur. Bu sayede fonksiyonda bu gösterici marifetiyle yapılan bütün işlemler fonksiyonun çağrılması sırasında parametre olarak verilen değer üzerine de etkili olur.
Örneğin aşağıda C dilinde örnek bir kod verilmiştir:
#include <stdio.h>
void f(int *p){
*p=20;
}
int main(){
int a=10;
f(&a);
printf("%d",a);
}
yukarıdaki kodda bulunan f fonksiyonuna a değişkeninin adresi (referansı) verilmiştir. Bu sayede f fonksiyonundaki parametre değişkeni olan p, a değişkeninin hafızadaki adresini göstermiş olur.
Fonksiyon içerisinde bulunan kod ile p göstericisinin atıfta bulunduğu değişkenin değeri 20 olarak değiştirilmiştir. Bunun anlamı main fonksiyonunda bulunan a değişkeninin de değerinin 20 olarak değişeceğidir.
Sonuçta yukarıdaki kod ekrana 20 basmaktadır.
mrb hocam ben burada referansla cagırmayı string için gerceklemek istedim ama basaramadım yazdıgım ko asagıda
#include “stdio.h”
void f(char *p)
{
p = “helloworld”;
printf(“%s”,p);
}
int main()
{
char dizi = “merhaba”;
f(dizi);
}
bu sekilde bir kod yazdım bu bir call by reference midir yoksa yanlıs mı hocam?
tesekkurler
boyle bir kod yazmamın sebebi size daha once soylemistim hocamız pointerlar fonksiyon iliskisi baslıgı adı altında asagıdaki soruyu verdi
Elimizde bir merhaba stringi olsun fonksiyon yerel bir değişkenle set edecek . Returnle değer döndürecek . Ana programda da ekranda merhabayı görmek istiyoruz .
sizde bana bu call by reference benxiyor deyip buranın linkini vermişstiniz
tesekkurler
kodunuz hatalı ve call by reference olarak doğru değil.
Yukarıdaki şekilde düzeltilebilir. Ayrıca kullandığınız derleyiciye göre (compiler) malloc fonksiyonu üzerinden gösterici için (pointer) yer ayırmanız da gerekebilir.