[C/C++] Zeiger

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von xonic, 15. Februar 2009 .

Schlagworte:
  1. 15. Februar 2009
    Zeiger

    Hallo,
    man hört immer von diesen schweren Zeiger kann einer möglichst einfach und eventuell mit ganz kleinem Beispiel erklären was damit gemeint ist anhand von http://de.wikipedia.org/wiki/Zeiger_(Informatik) kann ich mir immer noch nicht vorstellen was daran nun so blöd ist oder ob ich dies als manko nehmen würde nicht C++ zu lern sondern eine andere Sprache.
     
  2. 15. Februar 2009
    AW: Zeiger

    PHP:
    $var1  1 ;
    $var2  = & $var1 ;
    echo 
    $var1 ; //1
    $var2  5 ;
    echo 
    $var1 //5
    Als Beispiel in PHP.
    $var1 und $var2 ensprechen der selben Variable.
    Keine Ahnung was man damit jetzt an tollen Sachen machen kann.
     
  3. 15. Februar 2009
    AW: Zeiger

    Also im Prinzip finde ich Pointer gar nicht so schwer, wenn man das Prinzip verstanden hat. Man kann nur ziemlich leicht "verbotene" Dinge tun, wenn man Zeiger manipuliert.
    Ein Zeiger ist im Prinzip eine variable, in der die Adresse einer anderen Variablen gespeichert ist.
    Code:
    int* p;
    ist also eine Variable vom Typ int*, in der die Adresse einer int-Variable gespeichert werden kann, z.B. so:
    Code:
    int i;
    p=&i;
    (Mit dem & erhält man die Adresse einer Variablen.)

    Mit dem Deferenzierungsoperator * kann man damit auf den Wert, der an der Adresse steht, auf den der Zeiger zeigt. zugreifen.
    Bsp:
    Code:
    int i=3;
    int* p;
    p=&i;
    cout<<p; //Gibt die Adresse von i, also irgendeine nicht vorhersehbare Zahl aus
    cout<<*p //gibt 3 aus.
    Zeiger erscheinen erstmal ziemlich überflüssig, da man ja auch gleich die Variable verwenden könnte, aber ohne wären Dinge wie z.B. arrays gar nicht möglich, da diese auch nur auf Zeigern basieren.
    Code:
    test[3]
    ist nur eine andere Schreibweise für
    Code:
    *(test+3)
    Der Name eines Arrays ist eigentlich ein Zeiger auf das 1. Element und da die Variablen im Speicher direkt hintereinanderliegen kann man durch Erhöhung der Adresse des ersten Elements um z.B. 3 auf das vierte Element des Arrays zugreifen.

    Auch in der dynamischen Speicherverwaltung sind Zeiger wichtig sowie bei der Übergabe an Funktionen, wobei sie in letzterem in C++ größtenteils von Referenzen abgelöst wurden.
     
  4. 15. Februar 2009
    AW: Zeiger

    Hallo,
    achso mit PHP Arrys habe ich schon öfters gearbeitet also gibt es da sogesehn auch Zeiger.
    Nur verstehe ich nicht warum mir dann C++ in Verbindung mit Zeigern so oft gesagt wird
    bzw. warum das soviele an C++ kritisieren, wobei es die Zeiger anscheinend doch in anderen
    Programmiersprachen auch gibt?

    Danke aber schonmal für die ausführliche Erklärung.
     
  5. 15. Februar 2009
    AW: Zeiger

    Irgendwo gibt es immer Zeiger, der Computer muss schließlich wissen, wo die Variablen ligen, auf die er zugreifen soll. Es kommt nur darauf an, wie sehr sich der Programmierer darum kümmern muss und wie sehr das der Compiler tut. Und bei C/C++ ist halt der Programmierer mehr gefragt, als bei z.B. java
     
  6. 15. Februar 2009
    AW: Zeiger

    Eine wichtige funktion der Zeiger ist, dass man sie an Funktionen übergeben kann. Übergibt man den Wert einer Variablen (bzw. die variable direkt), so ist dies nur einen Kopie. Übergibt man allerdings die Adresse eines Objektes, so wird direkt diese Variable verändert!
    Sagen wir, wir haben eine Funktion, die den Wert einer Variablen vom Typ integer um x erhöhen soll, so brauchen wir 2 Parameter. Der erste ist die Variable, die erhöht werden soll und der 2. ist x, also die Zahl um die die Varable nr.1 erhöht werden soll!

    So sähe dann der Funktions-Kopf aus:
    Code:
    void addX(int* var, int x);
    Hier brauchen wir einen Zeiger, da wir die variable DIREKT verändern wollen und nicht nur eine Kopie der Variablen.

    Der Funktionskörper wäre dieser:
    Code:
    *var += x;
    So wird der Wert, der an der Stelle ist, auf den var zeigt um x vergrößert!

    So sähe dann ein Beispiel aus:

    Code:
    #include <iostream>
    
    using namespace std;
    
    void addX(int* var, int x);
    
    int main()
    {
     int tmp = 5;
     cout << "Before: " << tmp << endl;
     addX(&tmp, 4);
     cout << "After: " << tmp << endl;
     return 0;
    }
    
    void addX(int* var, int x)
    {
     *var += x;
    }
    
    Die Ausgabe ist dann die:
    Code:
    Before: 5
    After: 9
    Das geht zwar auch alles mit Referenzen, aber hab dir mal Zeiger gezeigt

    Bei größeren Projekten bietet das natürlich einen großen Geschwindigkeitsvorteil, da nur eine Adresse übergeben wird und nicht eine Kopie des Wertes, was bei großen Daten ein Nachteil wäre!

    greez

    //schau dir mal den vector und die Iteratoren der Standardbibliothek an, vllt verstehst du es dann ein wenig besser!
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.