[C/C++] Pointer auf Pointer?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von thecoolman4rr, 10. Oktober 2006 .

Schlagworte:
  1. 10. Oktober 2006
    Pointer auf Pointer?

    Moinsens... also ich hab ne Frage!
    Ich hab ein nettes Beispielprogramm geschrieben was bei meinem Buch gefordert/empfohlen wird.
    ich habe eine Basis-Klasse namens c_RaumSchiff und eine davon abgeleitete c_Minenleger ^^ ich weiß das ist alles schwachsinn aber egal es geht nur darum das ich das mit den Klassen usw kapiere .
    Mein Problem liegt nun bei dem Pointer auf die Klasse c_RaumSchiff! Ich wollte die Instanz der Klasse c_RaumSchiff auf dem heap erzeugen und deshalb hab ich nun ein problem mit den Pointern.
    Ich möchte in der main einen Pointer erstellen, dessen Addresse (also praktisch Pointer auf Pointer) an die Funktion RaumschiffErstellung weiter gegeben wird.
    Der Compiler (der der bei Dev-Cpp dabei ist) sagt mir nun:
    Ich wollt nun mal fragen ob man überhaupt Pointer auf Pointer machen kann und ob es wirklich daran liegt! Ansonsten könnte ich ja noch eine Referenz auf den Pointer machen...
    Code:
    void RaumschiffErstellung( const char &Art, const int &Anzahl, c_RaumSchiff *pAdresse);
    
    int main(void)
    {
     cout << "Was fuer ein Raumschiff moechten Sie erstellen?\n(S)tandart-Raumschiff\n(M)inenleger\n\nIhre Auswahl: ";
     char Auswahl;
     cin >> Auswahl;
     cin.ignore();
     cout << "\nWieviele dieser Raumschiff moechten Sie erstellen? ";
     int Anzahl;
     cin >> Anzahl;
     cin.ignore();
     c_RaumSchiff *Raumschiffe = NULL; // hier wird der Pointer erstellt
     RaumschiffErstellung( Auswahl, Anzahl, &Raumschiffe); // und hier wird der Pointer auf den Pointer erstellt
     cin >> Auswahl;
     cin.ignore();
    }
    void RaumschiffErstellung( const char &Art, const int &Anzahl, c_RaumSchiff *pAdresse)
    {
     if(Art == 'S' || Art == 's')
     {
     pAdresse = new c_RaumSchiff[Anzahl];
     }
     else if(Art == 'M' || Art == 'm')
     {
     pAdresse = new c_Minenleger[Anzahl];
     }
     else
     {
     cout << "\nUngueltige Eingabe!";
     }
    }
    ich hoffe euch fällt was hilfreiches ein!

    mfg thecoolman4rr


    *+~edit~+*
    mir fällt grade auf das man anscheinend keine Referenzen auf Pointer machen kann

    *+~edit2~+*
    ich hab das ganze mal etwas verallgemeinert damit man leichter sieht worauf es ankommt:
    Code:
    void TestFunktion(int *pAddresse);
    
    int main(void)
    {
     cout << "Hallo !" << endl;
     int *pPointer = NULL; // hier wird der pointer erstellt
     TestFunktion(&pPointer); // hier wird der pointer auf den Pointer erstellt
     cout << "Test bestanden!";
     int irgentwas;
     cin >> irgentwas;
     return 0;
    }
    
    void TestFunktion(int *pAddresse)
    {
     cout << "Wow TestFunktion wurde gestartet!" << endl;
     pAddresse = new int;
     cout << "Und sogar erfolgreich beendet =))" << endl;
    }
    hier kommt nun im Prinzip der selbe Fehler wie oben nur mit "int"
    btw. danke an den jenigen der das falsche ']' am Anfang der Code-Tags entfernt hat! =))

    *+~edit3~+*
    Hmm also ich hab jetzt nen bissel rumgetestet und habe herausgefunden das folgende Variante funktioniert:
    Code:
    void TestFunktion(int *&pAddresse);
    
    int main(void)
    {
     cout << "Hallo !" << endl;
     int TestVariable;
     cin >> TestVariable;
     int *pPointer = &TestVariable;
     TestFunktion(pPointer);
     cout << "Test bestanden!" << endl << *pPointer;
     int irgentwas;
     cin >> irgentwas;
     return 0;
    }
    
    void TestFunktion(int *&pAddresse)
    {
     cout << "Wow TestFunktion wurde gestartet!" << endl << *pAddresse;
     *pAddresse += 5;
     cout << "Und sogar erfolgreich beendet =))" << endl;
    }
    allerdings muss ich zu geben, dass mir das Ganze nicht wirklich einleuchten will! Ich kann es mir nur so erklären, dass bei der Parameterangabe das "*" noch zu dem Typ gehört und deshalb vor das "&" muss also vor das Referenzzeichen. Falls jemand genaueres weiß bitte posten (deswegen lass ich den Thread noch offen)

    Aus Spass anner Freude hab ich das ganze jetzt nochmal mit Pointern gemacht (also einfach die Referenzen durch Pointer ersetzt) und es klappt tatsächlich! Allerdings, muss man um den Wert verändern zu können auf die Addresse des Pointers zugreifen also mit 2 *!
    Code:
    void TestFunktion(int **pAddresse);
    
    int main(void)
    {
     cout << "Hallo !" << endl;
     int TestVariable;
     cin >> TestVariable;
     int *pPointer = &TestVariable;
     cout << "\nPointer: " << pPointer << endl;
     TestFunktion(&pPointer);
     cout << "Test bestanden!" << endl << *pPointer;
     int irgentwas;
     cin >> irgentwas;
     return 0;
    }
    
    void TestFunktion(int **pAddresse)
    {
     cout << "Wow TestFunktion wurde gestartet!" << endl << *pAddresse;
     **pAddresse += 5;
     cout << "Und sogar erfolgreich beendet =))" << endl;
    }
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.