Fonksiyonlara Pointerlar
Bir fonksiyona pointer hafizada ki fonksiyonun adresini icerir.Arrayler kisminda gordugumuz gibi, bir array ismi gercekte bir arrayin ilk elementinin adresidir.
Fonksiyonlara pointerlar fonksiyonlara gonderilebilir, fonksiyondan geri dondurulebilir ve array icinde sakli bir sekilde tutulabilirler.
Fonksiyonlara pointerlari daha iyi bir sekilde belirtmek icin assagida yer alan programda bubble sortu bu methoda uygun bir sekilde degistirdik.
Programda yer alan bubleSort fonksiyonu bir fonksiyona pointeri almaktadir.
Eger kullanici 1 girerse bilgiler kucukten buyuge, 2 girerse buyukten kucuge yazilacaktir.
int (*karsilastir)(int, int)
Bu bubble sorta iki tamsayi parameter ve bir tam sayi sonucuna geri donen bir fonksiyona pointer olan parameter beklendigini bildirir.
Programda bubble sorta gonderilen fonksiyon bir if(eger) durumu ile cagiriliyor. Bu durum su sekilde yazilir
if((*karsilastir)(calis[say], calis[say+1]))
Burada kullandigimiz (*) sembol degiskenini bir pointer oldugunu gosterir.
Assagida ki program bir datada yer alan sayilari istege gore buyukten kucuge veya kucukten buyuge siralar.
#include
#define SIZE 10
void bubble(int *, const int, int (*)(int, int));
int KucukTenBuyuge(const int , const int);
int BuyukTenKucukge(const int, const int);
main()
{
int a[SIZE] = { 2, 6, 4, 8, 10, 12, 89, 68, 45,
37}; /*Listenin Orijinal
Hali */
int sayac, sira;
printf("Kucukten Buyuge Siralamak Icin 1 Girin\n");
printf("Buyukten Kucuge Siralamak Icin 2 Girin\n");
scanf("%d", &sira);
printf("Data elemanlari Orijinal Hali\n");
for(sayac = 0; sayac <= SIZE - 1; sayac++)
printf("%4d", a[sayac]);
if(sira = = 1)
{
bubble(a, SIZE, KucukTenBuyege);
/*bubble fonksiyonunu cagirma*/
printf("\nData Elemanlari Kucukten Buyuge\n");
}
else{
bubble(a, SIZE,
BuyukTenKucuge); /*bubble
fonksiyonunu buyukten kucuge siralamak icin
cagirma*/
printf("Data Elemanlari
Buyukten Kucuge\n");
}
for(sayac = 0; sayac<= SIZE-1; sayac++)
printf("%4d",
a[sayac]);
printf("\n");
return(0);
}
void bubble(int *calis, const int buyukluk, int (*karsilastir)(int, int))
{
int gec, say;
void degistir(int *, int *);
for(gec = 1; gec <= buyukluk -1; gec++)
for(say = 0; sau <= buyukluk - 2; say++)
if((*karsilastir) (calis[say], calis[say
+ 1] ) );
degistir(&calis[say],
&[say + 1]);
}
void degistir(int *eleman, int * eleman2)
{
int hedef;
hedef = *eleman;
*eleman = *eleman2;
*eleman2 = hedef;
}
int KucukTenBuyuge(const int a, const int b)
{
return b < a;
}
int BuyukTenKucuge(const int a , const int b)
{
return b > a;
}
|