-> Operator bei Zeigern



  • Ja, frage soll nur sein, was das überhaupt bringt, so einen Zeiger auf ein int-Objekt zu machen.

    Oder es gibt ja auch:

    int *i = 2;

    Zulässig aber sinnfrei...-.- und im Buch der Kerl ist ganz begeistert davon und benutzt das nur.

    cya
    David



  • Sag blos, das gibt's wirklich? Nach meinem Kenntnisstand ist das ein Syntax-Fehler (oder zumindest undefiniert). Einem Zeiger kannst du nur eine legale Adresse (egal ob die von new geliefert wurde oder zu einer existierenden Variablen gehört) oder 0 zuweisen.



  • Im Buch steht das so... und der Compiler schluckt es.
    Allerdings verstehe ich einfach den Sinn von allgemein Zeigern nicht.
    Genau wie der Sinn von Referenzen mir noch leicht verschleiert ist 😃
    Ich würde einfach Objekte, ihre Namen.
    Variablen, ihre Namen definieren und dann darüber auch drauf zugreifen und sie verändern, wies gut ist.

    Naja... und in Zeigern sehe ich einfach keinen Sinn und warum die überhaupt immer verwendet werden.
    cya
    David



  • Referenzen sind Alias-Bezeichnungen für Variablen, die irgendwo anders im Programm existieren (durch die Parameterübergabe per Referenz kannst du z.B. direkt mit der Variable im Hauptprogramm hantieren).

    void per_val(int i)
    {
      i=5;
    }
    
    void per_ref(int& i)
    {
      i=5;
    }
    
    int main()
    {
      int i=10;
      cout<<"Start:    "<<i<<endl;//Ausgabe 10
      per_val(i);
      cout<<"value:    "<<i<<endl;//immer noch 10
      per_ref(i);
      cout<<"reference:"<<i<<endl;//nun 5
    }
    

    Pointer enthalten Speicheradressen, an denen sich andere Variablen befinden können - oder auch dynamisch angelegte Speicherbereiche ( int*i=new int[10]; enthält die Adresse eines 10 Felder großen int-Arrays).



  • 777 schrieb:

    ...

    int i = new int(2);
    

    dagegen funktioniert nicht.
    Obwohl es viel sinnvoller wäre...

    Nein !
    =>

    777 schrieb:

    ...Allerdings verstehe ich einfach den Sinn von allgemein Zeigern nicht....

    Stimmt ! 😉

    777 schrieb:

    ...Ich würde einfach Objekte, ihre Namen.
    Variablen, ihre Namen definieren und dann darüber auch drauf zugreifen und sie verändern, wies gut ist....

    Und wie würdest Du das machen:

    void setzeString(string s) {
       s = "777";
    }
    
    int main() {
       string mainString;
       setzeString(mainString);
       return 0;
    }
    

    ?

    Es hilft Dir für mainString überhaupt nichts, dass in s in setzeString() geändert wird, weil es ja zwei verschiedene Objekte sind.

    Oder wenn Objekte mit anderen verknüpft werden sollen:

    struct Person {
       string name;
    };
    
    struct KFZ {
       KFZ(Person bes): besitzer(bes) {}
       string modell;
       Person besitzer;
    };
    
    int main() {
       Person Simon;
       Simon.name = "Simon Meyer";
       KFZ bmw(Simon);
       KFZ audi(Simon);
       KFZ mofa(Simon);
    
       // Simon heiratet und ändert seinen Nachnamen:
       Simon.name = "Simon Mueller";
    
       // wem gehören jetzt die KFZs ?
    ...
    

    Genau für sowas braucht man außer "Objekten" noch "Verweise" ... und die sind in C++ eben als Referenzen und Zeiger angeboten.

    Mal eine Frage: In welcher Programmiersprache hast Du bislang programmiert ?

    Gruß,

    Simon2.



  • Mal eine Frage: In welcher Programmiersprache hast Du bislang programmiert ?

    Bislang habe ich C# meistens gemacht oder einfach mit Borland Buttons geklickt.

    Doch das hat mir nicht gefallen, weil ich zwar so tolle Programme schreiben konnte, jedoch von den untersten Grundlagen eigentlich keine Ahnung hatte.
    Somit habe ich mir den C++ Primer geschappt um C++ mal von Grund auf zu lernen.

    Naja... und da kommt es jetzt teilweise zu verständnisproblemen.

    Aber was dein erstes Beispiel angeht:
    Dort bringen Zeiger wirklich etwas.

    Doch eigentlich bringen sie auch nur ein bisschen, weil man die Funktion einfach innerhalb von main() definieren könnte und alles ginge wieder ohne die Zeiger 😛

    cya
    David



  • 777 schrieb:

    Doch eigentlich bringen sie auch nur ein bisschen, weil man die Funktion einfach innerhalb von main() definieren könnte und alles ginge wieder ohne die Zeiger 😛

    Erstens kennt C++ keine lokalen Funktionen (d.h. du kannst nichts "innerhalb von main()" definieren) und zweitens besteht die Stärke von Referenz-Parametern dahinter, daß du bei jedem Aufruf neu entscheiden kannst, welche Variable an den Parameter gebunden wird.



  • Habe mal das Programm von CStoll nachprogrammiert:

    #include <iostream>
    #include <vector>
    using std::cout;
    using std::endl;
    using std::vector;
    using std::cin;
    void veraendere_zahl(int);
    void veraendere_zahl_wirklich(int);
    int main() 
    { 
       int hallo = 10;
       cout << hallo << endl;
       veraendere_zahl(hallo);
       cout << hallo<< endl;
       veraendere_zahl_wirklich(hallo);
       cout << hallo << endl;
       getchar();   
    }
    void veraendere_zahl(int hallo)
    {
       hallo = 20;   
    }    
    void veraendere_zahl_wirklich(int &hallo)
    {
       hallo = 20;   
    }
    

    Meine Fragen zu dazu wären, dass es doch nicht geht eine Funktion mit übergebenem Wert auszugeben, die garkeinen Rückgabewert hat.
    Hier habe ich nun zuvor die Funktion aufgerufen und dann den neuen 'hallo' ausgegeben.

    Dennoch meldet der Compiler auch in diesem Programm einen Fehler:

    [Linker error] undefined reference to `veraendere_zahl_wirklich(int)'

    cya

    David



  • 777 schrieb:

    Meine Fragen zu dazu wären, dass es doch nicht geht eine Funktion mit übergebenem Wert auszugeben, die garkeinen Rückgabewert hat.
    Hier habe ich nun zuvor die Funktion aufgerufen und dann den neuen 'hallo' ausgegeben.

    Du gibst die Funktion doch gar nicht aus 😉

    Dennoch meldet der Compiler auch in diesem Programm einen Fehler:

    [Linker error] undefined reference to `veraendere_zahl_wirklich(int)'

    Ja, der Prototyp sollte auch zur tatsächlich definierten Funktion passen, sonst hast du Probleme (die Lösung heißt "veraendere_zahl_wirklich(int**&**);").



  • Wahrhaftig!
    Die Lösung des Problems! xDD

    Danke für eure Hilfe, Jungs.
    Das klingt alles logisch.


Anmelden zum Antworten