Problem mit Feldern



  • Cheffe schrieb:

    aber ich kann die variablen auch gleich direkt bearbeiten oder??
    zB a=5 und nicht *Zeigeraufa=5... wo is da der unterschied? und was bringts mir Zeigeraufa zu nutzen?

    mfg Cheffe

    Klar kannst Du die Variable auch direkt aendern.

    Zeiger verwendet man immer dort, wo man gerne einen Zeiger auf Daten haben moechte. Z.B. wie bereits von enno-tyrant beschrieben, bei der Parameteruebergabe an Funktionen. Aber auch, wenn man Datenstrukturen hat, bei denen man keine Datenverdoppelung moechte. Oder wenn man mehrere Datenstrukturen miteinander verbinden will.

    struct Auto {
       string   marke;
       string   modell;
       Rad*     raeder[4];   // vier Zeiger, die jeweils auf ein Rad zeigen.
    };
    struct Reifen {
       string   marke;
       string   modell;
       int      groesse;
    };
    struct Felge {
       string   marke;
       string   modell;
    };
    struct Rad {
       Reifen*  bereifung;  // zeigt auf einen Reifen
       Felge*   felge;      // zeigt auf eine Felge
    };
    

    Was man noch bedenken muss, ist, dass Zeiger im Prinzip auch nur Variable sind, die einen Wert haben muessen, bevor sie verwendet werden. Ein typischer Anfaenger-Fehler, der meist zu einem Absturz fuehrt, ist:

    int* v;
    *v = 5;
    

    Obwohl das Ganze harmlos aussieht, ist es ein Programmfehler. Denn dem Zeiger "v" wurde noch keine Adresse zugewiesen. Solche Variable nennt man uninitialisiert, sie koennen jeden beliebigen zufaelligen Wert enthalten, der gerade in der Speicherzelle steht, die die Variable gerade belegt.

    In C++ hat man versucht, das Problem zu minimieren, indem man Referenzen eingefuehrt hat. Eine Referenz ist ein Zeiger, der immer initialisiert sein muss, und der immer auf eine bestimmte Adresse zeigt.

    int a;
    int& r = a;  // "r" ist eine Referenz auf eine Ganzzahl, 
                 // die "a" referenzieren soll.
    r = 5;       // aendert den Wert von "a" in 5, da "r" eine Referenz auf "a" ist.
    


  • Hi!

    Erstmal vielen dank für die ganzen erklärungen 👍 das hat mir Zeiger wirklich näher gebracht... 🙂 (obwohl ich se immer noch unheimlich finde^^)

    jetzt noch ne frage (is halt en bissl offtopic): ich suche schon die ganze zeit irgendwelche Aufgabenstellungen für programme um C++ etwas üben zu können... mir fallen leider keine ein 😞
    kennt ihr villeicht irgendwelche Seiten zu dem Thema? lösungen wären nicht schlecht müssen aber nit sen...
    Oder villeicht irgendwas anderes... bin für alles dankbar 🙂

    mfg Cheffe



  • also ich mach das so das ich mir eigenen problemstellungen gebe

    zb addiere 2 zahlen oder subtrahieren

    oder schau nach algorithmen zur primzahlzerlegung oder pruefung usw

    das kann man von anfang an, doch mit vorranschreitendem wissen verfeinert man das ganze (zb so dass man zeiger uebergibt um die zahlen nur einmal erzeugen zu muessen)

    zb auf beliebig grosse zahlen da kommen dann solche sachen wie dynamische arrays

    ,wie man sie in vb nennt und in c eigentlich mit verketteten listen realisiert,

    mit rein

    ich wuerde da mit kleinen sachen anfangen und zur pruefung ob du richtig liegst brauchste ja nur dein ergebnis ueberpruefen 😉



  • Hi!

    naja mit solchen Aufgaben hab ichs auch scho probiert... aber langsam gehn mir die ideen aus 😞 naja ich hab mir daweil die Aufgabe gestellt ein Schiffe versenken zu programieren... was bei meinen Programmierkenntnissen ganz schön schwer is... leider kann ich noch ned irgendwie grafisch programmieren also muss halt ein 2D Array her...
    mal sehn ob was draus wird 🙂

    mfg Cheffe


  • Mod

    Power Off schrieb:

    In C++ hat man versucht, das Problem zu minimieren, indem man Referenzen eingefuehrt hat. Eine Referenz ist ein Zeiger, der immer initialisiert sein muss, und der immer auf eine bestimmte Adresse zeigt.

    eine referenz kann durch pointer implementiert sein, sie ist aber keiner. und es gibt objekte, die keine adresse haben (z.b. registervariablen) - einen pointer darauf kann man nicht erstellen (was dazu führt, dass das betreffende objekt im speicher angelegt werden muss, wenn man bezug auf seine adresse nimmt), eine referenz dagegen schon.



  • hmm und wie deklariere ich einen pointer und wie eine Referenz? gibts da nen unterschied?

    mfg Cheffe



  • int a = 5; // int-varibale (wert 5)
    int* i;    // zeiger auf int
    i = &a;    // zeiger auf adresse von 'a'
    

    sollte sich hier in fehler eingeschlichen haben, kritisiert mich ruhig 😉

    //edit: berichtigt



  • enno-tyrant schrieb:

    sollte sich hier in fehler eingeschlichen haben, kritisiert mich ruhig 😉

    die letzte kommentarzeile oder der dazugehörige code ist verkehrt.



  • "&" als unaerer Praefix-Operator (also mit einem Operand) nennt man "address of" Operator (also "Addresse von" Operator), "&x" bezeichnet die "Adresse von x".

    "&" als Typ-Qualifizierer (unaerer Postfix-Typ-Operator) nennt man "reference to" Operator oder Qualifier. "int&" bezeichnet "Referenz auf int", so wie "int*" "Zeiger auf int" bezeichnet. Am besten ist, man liest solche Typen von rechts nach links.

    🙂



  • uiuiui jetzt kann ich auchnoch anfangen von rechts nach links zu lesen... was man nicht alles fürs programmierenlernen tut^^

    kann mir bitte mal wer zeigen wie genau man einen zeiger deklariert? wär nett 🙂

    mfg Cheffe



  • au blödsinn!! ich meinte:
    wie man ne Referenz deklariert... sry

    mfg Cheffe 🙂



  • garnicht

    jede variable hat ne addresse mit ner referenz uebergibt man diese



  • sry total quatsch 😉

    zb

    int &referenz;
    

    edit:
    referenz ist jetzt aber nur ne addresse auf int wenn du sie nicht mit einer variablen initialisierst existiert diese addresse aber nicht

    zb

    int blah;
    int &referenz = blah;
    


  • kannte das bis jetzt nur als uebergabe an eine funktion

    aber selbst da wird sie ja als ueberga deklariert



  • ok dange 😃

    mfg Cheffe 🙂



  • Vertexwahn schrieb:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	cout<<"Wie gross soll das Array werden? "; 
    
    	int Summe = 0;
    
    	int ArraySize  = 0;
        cin>>ArraySize;
        int* Array = new int[ArraySize];
        
    	for(int i = 0; i < ArraySize; i++)
    	{
    		cout<<"Geben Sie das "<<i+1<<"te"<<" Element ein: ";
    		cin>>Array[i];
    
    		Summe = Summe + Array[i];
    	}
    
    	cout<<"Die Summe ist: "<<Summe<<endl;
    
    	delete[] Array;
    }
    

    ich hab gelernt, dass die größe von feldern schon zur kompilierzeit bekannt sein muss...wundert mich, dass das auch so geht



  • Wie denn, haben wir schon den 1.4.? 🤡


Anmelden zum Antworten