11.5 Fonksiyon Parametresi Olan Göstericiler
11.5 Fonksiyon Parametresi Olan Göstericiler
C (ve C++) programlama dilinde fonksiyon parametreleri değer geçerek (pass by value) yada adres geçerek (pass by reference) olarak geçilebilir. Bölüm 8’deki uygulamalarda fonksiyonlara parametreler değer geçerek taşınmıştı. Bu şekilde geçirilen parametreler, fonksiyon içersinde değiştirilse bile, fonksiyon çağılıldıktan sonra bu değişim çağrılan yerdeki değerini değiştirmez. Fakat, bir parametre adres geçerek aktarılısa, fonksiyon içindeki değişikler geçilen parametreyi etkiler. Adres geçerek aktarım, gösterici kullanmayı zorunlu kılar.
Örneğin, Program 11.5’de fonksiyonlara değer ve adres geçerek aktarımın nasıl yapılacağı gösterilmiştir.
Program 11.5: Bir değişkenin içeriğini ve adresini ekrana yazdırma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/* 10prg05.c: Değer geçerek ve adres geçerek aktarım */ #include <stdio.h> void f1(int ); /* iki fonksiyon */ void f2(int *); int main() { int x = 55; printf("x in degeri,\n"); printf("Fonksiyonlar cagrilmadan once: %d\n",x); /* f1 fonksiyonu çağrılıyor...*/ f1(x); printf("f1 cagirildiktan sonra : %d\n",x); /* f2 fonksiyonu çağrılıyor...*/ f2(&x); printf("f2 cagirildiktan sonra : %d\n",x); return 0; } /* Değer geçerek aktarım */ void f1(int n){ n = 66; printf("f1 fonksiyonu icinde : %d\n",n); } /* Adres geçerek aktarım */ void f2(int *n){ *n = 77; printf("f2 fonksiyonu icinde : %d\n",*n); } |
5. ve 6. satırlada kendine geçilen parametrenin değerini alan f1 fonksiyonu ve parametrenin adresini alan f2 adlı iki fonksiyon örneği belirtilmişdir. 11. satırdaki x değişkeni 16. ve 21. satırlarda, f1(x) ve f2(&x) fonksiyonlarına, sırasıyla değer ve adres geçerek aktarılmıştır. f1 içinde x (n = 66; işlemi ile) değişime uğramış, fakat çağrılma işleminin sonucunda, x‘in değeri değişmemiştir. Ancak f2 içinde x‘in ( *n = 77 işlemi ile) değişimi, çağrıldıktan sonrada korunmuştur. Yani, adres geçerek yaplıan aktarımda, f2‘ye aktarılan değer değil adres olduğu için, yollanan x parametresi f2 içinde değişikliğe uğrayacak ve bu değişim çağrıldığı 21. satırdan itibaren devam edecektir.
ÇIKTI
1 2 3 4 5 6 |
x in degeri, Fonksiyonlar cagrilmadan once: 55 f1 fonksiyonu icinde : 66 f1 cagirildiktan sonra : 55 f2 fonksiyonu icinde : 77 f2 cagirildiktan sonra : 77 |
Program 11.6’da iki tamsayı değişkeninin nasıl takas (swap) edileceği gösterilmiştir. Bu işlemi C porgramlama dilinde, eğer değişkenler global olarak bildirilmemişse, gösterici kullanmadan bu işlemi yapmak imkansızdır.
Program 11.6: İki tamsayının birbiri ile takas edilmesi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/* 10prg06.c: iki sayının birbiri ile takas edilmesi */ #include <stdio.h> void takas(int *, int *); int main() { int a, b; a=22; b=33; printf("takas oncesi : a=%d b=%d\n",a,b); takas(&a, &b); printf("takas sonrasi: a=%d b=%d\n",a,b); return 0; } void takas(int *x, int *y) { int z; z = *x; *x = *y; *y = z; } |
ÇIKTI
1 2 |
takas oncesi : a=22 b=33 takas sonrasi: a=33 b=22 |