Navigation

2.5.5 Zeiger auf Funktionen

int (* zfint)(); /* vereinbart einen Zeiger zfint*/
Der Zeiger zfint kann als Werte die Adressen von Funktionen annehmen, die selbst int-Funktionswerte liefern. (z.B.: int f1(); zfint = f1;)

Wenn ein Funktionsname in einem Ausdruck vorkommt und keinen Funktionsaufruf darstellt, so wird er als Adresse der Funktion interpretiert. Der Operator & ist nicht nötig.

Der Aufruf von
z = f1 (x, y);
kann dann mit der Zeigervariable erfolgen:
z = (*zfint) (x, y);
Zeiger auf Funktionen können z.B. benutzt werden, um Funktionen als Funktionsargumente zu übergeben.

Die folgende Funktion ermöglicht das Suchen von Elementen beliebiger Typen. Die Funktion bsearch realisiert den gleichen Funktionsumfang wie die Funktion gleichen Namens der Standardbibliothek.

BEISPIELE/b255a.c: 

#include <stdio.h>
main()            /* Zeiger auf Funktionen */
{   
    int i, *p;
    int f1(), (*fi)();

    i=3; p= &i;
    fi=f1;
    printf("i=%d, f1(i+1)=%d, (*fi)(*p)=%d\n",
            i,    f1(i+1),    (*fi)(*p)    );
}

f1(a)
int a;
{        return a*a;        }

BEISPIELE/b255b.c: 

#include <stdio.h>

char *bsearch(key,base,nel,w,compar)       /* Binaeres Suchen */
char *key;                    /* Zeiger auf gesuchtes Element */
char *base;           /* Zeiger auf erstes Element des Feldes */ 
int nel;                               /* Anzahl der Elemente */
int w;                               /* Elementlaenge in Byte */ 
int (*compar)();             /* Zeiger auf Vergleichsfunktion */
{
    int mid,i;

    if (nel<=0) return(NULL);
    mid=nel/2;
    if ((i=(*compar)(key,&base[mid*w]))==0)
       return(&base[mid*w]);
    if (i<0)
       return(bsearch(key,base,mid-1,w,compar));
    else
       return(bsearch(key,&base[(mid+1)*w],nel-mid-1,w,compar));
}

int ccomp(pa,pb)                
char *pa,*pb;                      /* beliebige Typen moeglich */
{
    return(*pa-*pb);             /* Vergleich von *pa mit *pb */
}

main()
{
    char c,*bsearch(),*p;

    c='F';
    p=bsearch(&c,"ABCDEFGHI",10,sizeof(char),ccomp);
    printf("p= %c\n",*p);
}

Navigation