Variablendeklaration



  • Hallo,
    ich bin gerade dabei, einen Code zu einem Algorithmus der Neuroinformatik durchzuarbeiten und bin dabei auf folgende Variablendeklaration gestoßen:

    double (*objective)(int, double*), *xInit, cc, dcov, term, N, M;
    int (*constraint)(int, double*, int*), (*init)(int, double*), *out, m, n, i, k;
    char **ptr;
    

    Im Grunde ist meine Frage einfach, was hier überhaupt deklariert wird.
    Ich verstehe nämlich nicht ganz, was die folgenden Dinge sollen:

    1.) double (*objective)(int, double*) bzw. int (*constraint)(int, double*, int*)
    2.) char **ptr;

    Wieso ist da ein Sternchen vor dem objective und wieso ist es in Klammern gesetzt? Was bedeutet das (int, double*) dahinter? Dasselbe bei constraint und init.
    Und was bedeutet das Doppelsternchen bei ptr?

    Bin noch nicht so erfahren in C und das mit den Zeigern habe ich nicht so ganz raus. 🙂 Hoffe, jemand kann mir da helfen.



  • Brechen wir das mal runter:

    // double (*objective)(int, double*), *xInit, cc, dcov, term, N, M;
    //
    // ist das gleiche wie:
    //
    double (*objective)(int, double*);  // objective ist ein pointer auf eine Funktion, die einen double returned und int, double* als Parameter bekommt.
    double *xInit; // xInit ist ein pointer auf einen double
    double cc; // cc ist ein double
    double dcov; // dcov ist ein double
    double term; // term ist ein double
    double N; // N ist ein double
    double M; // M ist ein double
    
    // int (*constraint)(int, double*, int*), (*init)(int, double*), *out, m, n, i, k;
    //
    // ist das gleiche wie:
    //
    int (*constraint)(int, double*, int*); // constraint ist ein pointer auf eine Funktion, die einen int returned und int, double*, int* als Parameter bekommt.
    int (*init)(int, double*);  // init ist ein pointer auf eine Funktion, die einen int returned und int, double* als Parameter bekommt.
    int *out; // out ist ein pointer auf einen int
    int m; // m ist ein int
    int n; // n ist ein int
    int i; // i ist ein int
    int k; // k ist ein int
    
    char **ptr;  // ptr ist ein pointer auf einen pointer auf einen char
    


  • Um das vielleicht noch besser zu erläutern:

    Deklarationen sind in C von innen nach außen zu lesen, beginnend mit dem Identifier (Name des Dings, das deklariert wird) ist und dann immer weiter entsprechend der Operatorpräzedenz. Klammern können benutzt werden, um Einfluss auf die Reihenfolge zu nehmen.

    Beispiel:

    double (*objective)(int, double*);
    
    // Wir beginnen beim Identifier "objective"
    // Aufgrund der Klammern kommt als nächstes der * links von objective => objective ist ein Pointer.
    // Pointer auf was? Schauen wir uns an, was noch übrig bleibt:
    // double   __   (int, double*)
    // => objective ist ein Pointer auf eine Funktion, die double returned und die einen int und einen double* als Parameter bekommt.
    


  • Super, dann macht auch der Rest des Codes endlich Sinn.
    Vielen Dank für die ausführliche Erläuterung!


Anmelden zum Antworten