[Anfänger] Fragen zu Zeiger als Rückgabewert von Funktionen



  • Hallo liebe C++ Community!
    Ich habe mich hier angemeldet, da ich gerne C++ lernen möchte aber zur Zeit ein wenig beim Thema „Zeiger als Rückgabewert" stocke.
    Als Lehrbuch habe ich „C++ von A bis Z" von Jürgen Wolf.

    Es geht um folgenden Code:
    (Falls einer das Buch griffbereit hat S.185-186)

    #include <iostream>
    using namespace std;
    
    int *dynamic_array( int elements );
    int *renew( int *old, int sizeold, int sizenew );
    
    int main( void ){
    
        int *iptr = dynamic_array( 10 );
    
        for ( int i = 0; i < 10; i++ ) {
    	    iptr[i] = i;
        }
    
        iptr = renew( iptr, 10, 15 );
    
        for( int i = 10; i < 15; i++ ){
        	iptr[i] = i;
        }
    
        for( int i = 0; i < 15; i++ ){
        	cout << iptr[i] << "\n";
        }
    
        delete [] iptr;
    return 0;
    }
    
    int *dynamic_array( int elements ){
    
    	int *array = new int [elements];
    
    return array;
    }
    
    int *renew( int *old, int sizeold, int sizenew ){
    
    	int *tmp = new int [sizenew];
    
    	for( int i = 0; i < sizeold; i++ ){
    		tmp[i] = old[i];
    	}
    
    delete [] old;
    return tmp;
    }
    

    Im Endeffekt ist meine Intention für diesen Forum-Beitrag einfach eine Verständnisfrage.
    Ich Persöhnlich finde die Arbeit mit den Zeigern noch ein wenig Mühselig, zusätzlich finde ich diesen Code ein bisschen verwirrend, daher wollte ich euch folgende Fragen stellen.
    (Zum sicherstellen ob ich es denn auch kapiert habe)

    1. *Zeile 4: int dynamic_array( int elements );
      Wird hier ein integerrückgabewert als Zeiger erwartet?
      MUSS dann das/der(?) return der Fkt. unbedingt ein Zeiger wiedergeben?

    2. *Zeile 9: int iptr = dynamic_array( 10 );
      Hier wird ein Zeiger erstellt (*iptr) der auf das erste Feld eines
      neuen allokierten Arrays mit 10 Felder zeigt(array[0]), oder?

    3. Zeile 15: iptr = renew( iptr, 10, 15 );
      Der Zeiger zeigt auf das neue allokierte Array(TMP) welches von
      von return der FKT an den Aufruf zurückgegeben wurde?
      Besonders Paradox finde ich dass „iptr = ..(iptr...)"
      in der Zeile, erst wird der iptr mit den alten Inhalt übergeben
      um nach der Bearbeitung neu beschrieben zu werden...?

    4. Zeile 36: int *renew( int *old, int sizeold, int sizenew )
      Hier wird als übergabeparameter ein int *old verlangt.
      Wieso ist es falsch wenn ich beim Aufruf in Zeile 15:
      iptr = renew( *iptr, 10, 15 ); setze?
      Mein Compiler sagt dann zwar:
      Error E2034 a.cpp 15: Cannot convert 'int' to 'int *' in function main()
      Error E2342 a.cpp 15: Type mismatch in parameter 'old' (wanted 'int *', got 'int') in function main()
      Aber so richtig kann ich das nicht nachvollziehen.

    So ich hoffe ich verlange mit meinen ersten Beitrag mit diesen vier Fragen nicht zuviel 😉

    Danke und Gruß
    ESC++



  • Zur weiteren Information kannst du dir z.Bsp. das hier noch durchlesen
    aus der hiesigen FAQ
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39497.html

    1. Zeile 4: int *dynamic_array( int elements );
      Wird hier ein integerrückgabewert als Zeiger erwartet?
      MUSS dann das/der(?) return der Fkt. unbedingt ein Zeiger wiedergeben?

    Ja, das muß ein Zeiger sein. Die Funktion soll ja ein Array von ints erzeugen und zurückgeben und so ein Array gibt man zurück indem man einen Zeiger auf die erste Position dieses arrays zurückgibt.

    1. Zeile 9: int *iptr = dynamic_array( 10 );
      Hier wird ein Zeiger erstellt (*iptr) der auf das erste Feld eines
      neuen allokierten Arrays mit 10 Felder zeigt(array[0]), oder?

    Ja, siehe erste Antwort.

    1. Zeile 15: iptr = renew( iptr, 10, 15 );
      Der Zeiger zeigt auf das neue allokierte Array(TMP) welches von
      von return der FKT an den Aufruf zurückgegeben wurde?
      Besonders Paradox finde ich dass „iptr = ..(iptr...)"
      in der Zeile, erst wird der iptr mit den alten Inhalt übergeben
      um nach der Bearbeitung neu beschrieben zu werden...?

    Mit dieser Funktion soll das Array vergrößert werden. Da das nicht so einfach geht, wird dort ein neues Array angelegt, der Inhalt des alten hineinkopiert und der Zeiger auf dieses neue Array zurückgegeben. Vorher wird der Speicher des alten Arrays gelöscht.



  • Hallo,
    okay alles klar.
    Danke 🙂


Anmelden zum Antworten