Öncelikle kısaca teorik bilgileri verip yazının en altında karşılaştırmalarını yapacağım.
Bir yordam çağrımı gerçekleşince, etkin olan program birimindeki komutların çalışması durdurulur ve yordam(fonskiyon,altprogram) etkin duruma geçer. Bir fonksiyona parametre verirken karşımıza gerçek ve resmi parametre kavramları çıkar. Aşağıdaki görselde açıklanmıştır.

1- Call By Value (Değer ile çağırma)
Bu yöntemde resmi parametre, karşı gelen gerçek parametrenin değeriyle ilklendikten sonra, altprograma yerel bir değişken olarak nitelendirilir. Gerçek parametre, sabit, değişken veya ifade olabilir. Bu yöntem en güvenli parametre aktarım yöntemidir. Fiziksel olarak gerçek parametrenin bir klonu bellekte resmi parametrenin stack’deki yerinde oluşturulur ve resmi parametreye aktarılır.
NOT: Bu yöntemde resmi parametre değişimi gerçek parametreye yansımaz!!!
2- Call By Result (Sonuç ile çağırma)
Daha profesyonel bir açıklama olması için ders kitabımdan alıntı yapacağım.
Bu yöntemde çağırım deyimi ile altprograma bir değer aktarılmazken, gerçek bir parametreye karşı gelen resmi parametrenin değeri, altprogram sonunda, denetim yeniden çağıran programa geçmeden önce, gerçek parametreyi gösteren değişkene aktarılır. Bu tanımlamadan anlaşıldığı gibi, gerçek parametrenin değişken olması zorunludur.
Bu yöntemi uygulayabilmek için parametre olarak vereceğimiz değişkenlerin başlangıç değerinin olmaması gerekir. Fonksiyon bize bu değerlerin set edilmiş halini geri döndürür ve kaydeder.
3- Call By Value-Result(Değer ve sonuç ile çağırma)
Bu yöntem ilk iki yöntemin karmasıdır. Call By Result ile tek farkı parametrenin başlangıç değeri olmasıdır. Fonksiyon bitince başlangıcı olan gerçek parametreye içerdeki resmi parametreyi set eder.
4- Call By Reference (Referans ile çağırma)
Bu yöntemi diğerlerinden ayıran en büyük fark parametre olarak değerin değil değerin adresinin verilmesidir. Bu yöntemde daha önce gösterdiğim pointerler kullanılır. Daha iyi anlaşılması için bir görsel bırakıyorum. Değer kopyalanması yerine değerin adresi üzerinden direkt set işlemi gerçekleştiriliyor.
Son olarak Call By Name adlı yöntem bulunuyor ama sanırım bu 60’lı yıllarda Algol dilinde vs. kullanılıyordu. Bu yöntemi açıkçası bende bilmiyor ve saçma buluyorum. Bu yüzden anlatmayacağım.

Referans yöntemi diğer yöntemlere göre en az bellek işgal eden yöntemdir. Bu yöntemde pointerlerde belleği işgal ediyor ama daha az yer kaplıyor ve bu işlem için daha az zaman gerekiyor.
Pointerlerin Ram’deki yeri adlı yazımı mutlaka okuyun, pointerlerin kapladığı alan ile ilgili çok önemli bilgiler var.
Şimdi karşılaştırmalarını yapıp sonradan örneklere geçelim.
| Call By Value | Call By Referance |
| Parametre olarak geçilen gerçek değişkenler değişmeyeceğinden güvende kalır. | Parametre olarak geçilen ana değişkenler değişir. |
| Hafıza açısından verimli değildir. Aynı değişken için oluşturulmuş iki adet kopya vardır. | Hafıza açısından verimlidir. Kopyalama yapılmaz ve değeri tutmak için yinelenen veriler oluşturmaz. |
| Kopyalama işlemi olduğu için yavaştır. | Kopyalama işlemi olmadığı için hızlıdır. |
| Referans olarak verilen verinin başlangıç değerinin olması gerekir. |
Örnekler:
Call By Value Örnekleri:
Sonuç 0 olacaktır.

2-Fonksiyon içinde a=12, b=7
Ana blokta x=5, y=7 olacaktır.
void func(int a, int b)
{
a += b;
printf("In func, a = %d b = %d\n", a, b);
}
int main(void)
{
int x = 5, y = 7;
// Passing parameters
func(x, y);
printf("In main, x = %d y = %d\n", x, y);
return 0;
}
Call By Result Örnekleri:
Sonuç a=6 b=4 olacaktır.

Call By Result-Value Örnekleri
Sonuç x için 1 olacaktır.

Call By Referance Örnekleri:
1-Sonuç ilk çağrıda a için 1, b için 3, ikinci çağrıda a için 1, b için 7 olacaktır.

2- Aşağıdaki örnek için a=20, b=10 olur.
void swapnum(int* i, int* j)
{
int temp = *i;
*i = *j;
*j = temp;
}
int main(void)
{
int a = 10, b = 20;
// passing parameters
swapnum(&a, &b);
printf("a is %d and b is %d\n", a, b);
return 0;
}