&-Operator in Funktionsparameterliste



  • Hallo!

    Ich habe folgende Aufgabe:

    Der Prototyp einer Funktion lautet: int fkt1(float *,int &) ;
    Im rufenden Programm sind die Variablen y und x vom Typ int,
    die Variable n ist vom Typ float. Der Wert von y wird als
    Funktion fkt1 in Abhängigkeit von n und x berechnet. Man gebe
    den Aufruf an.

    Ich komme selbst darauf, dass der Aufruf am Anfang so aussehen muss:

    y=fkt1(&n, ???)

    Ich soll ja einen Zeiger auf eine float übergeben, was ja bedeutet, dass ich die Adresse einer float-Variabeln übergeben muss (in diesem Fall die Adresse von "n").
    Nur mit dem zweiten Parameter stehe ich etwas auf Kriegsfuß. Irgendwie macht dieser Adressoperator & für mich an dieser Stelle keinen Sinn.
    Kann mir jemand kurz erklären, wie ich dass zu interpretieren habe ?

    Vielen Dank
    Maik



  • Kiamur schrieb:

    int fkt1(float *,int &) ;
    [...]
    Nur mit dem zweiten Parameter stehe ich etwas auf Kriegsfuß. Irgendwie macht dieser Adressoperator & für mich an dieser Stelle keinen Sinn.

    Der macht auch nur Sinn, wenn das C++ ist (gehört also nicht in dieses Forum, hier geht es um C). Dann bedeutet das, dass der zweite Parameter eine Referenz auf int ist. Aufruf etwa so:

    float f;
      int i;
      fkt1(&f, i);
    


  • erst mal danke für die Antwort !

    . . . und sorry, dass ich im falschen Forum gepostet habe. Eigentlich machen wir an der FH nämlich "nur" C. Deshalb habe ich es hier hin gepostet. Aber das ist nicht das erste mal, dass C und C++ von unseren Profesoren in einen Topf geworfen wird . . .

    Gruß
    Maik



  • Das hier ist eigentlich C++ Code. Der Prototyp int x(float &y); bedeutet das y per Referenz übergeben wird. Und das heist das zwar ein Pointer übergeben wird, nur du merkst nichts davon (ausser dem &). Du kannst die Variable direkt übergeben und der Compiler kümmert sich selbst um die referenzierung und dereferenzierung. In deinem Fall würde das so aussehen:

    y = fkt1(&n, i);
    


  • Also, dass heißt dann, dass von beiden Variabeln (n, x) die Adressen an die Funktion übergeben werden, und das dies lediglich zwei verschiedene Methoden sind dies zu bewerkstelligen ?

    Es ist alo ein Beispiel, wie man es in der Praxis nie verwenden würde, weil man sich dann ja in einer Parameterliste (und sogar im ganzen Programm) auf eine Methode einigen würde.

    Ist das so weit richtig, was ich schreibe? - Denn dann habe ich es verstanden.

    Gruß
    Maik



  • Stimmt, es sind zwei verschiedene Methoden die Adresse zu übergeben. Der unterschied ist der, das man bei Referenen sich nicht drum zu kümern braucht das es ein Pointer ist, ein Beispiel:

    void fooref(int &x)
    {
       x = 50;
    }
    
    void foopnt(int *x)
    {
       *x = 50;
    }
    
    main()
    {
       int tmp;
    
       fooref(tmp);
       foopnt(&tmp);
    }
    

    Sinnvoll sind Referenzen überall da, wo man in einer Funktion auf Externe Variablen zugreifen muss, oder man die übergabe von großen Strukturen vermeiden will. In C muss man das mit Pointern machen, in C++ kann man dafür Referenzen benutzen und spart sich damit beim Aufruf den Adressoperator und in der Funktionsdefinition die Dereferenzierung.

    <edit> Und stimmt: das Mixen dieser beiden Methoden ist ziemlich unsinnig, ausser möglicherweise, wenn ein Array, also zB int strlen(const char *src);, übergeben wird. </edit>



  • Ahhhh ! 😃

    Vielen Dank. Jetz ist wirklich alles klar. 👍

    Gruß
    Maik


Anmelden zum Antworten