[Tutorial] Zeiger(Pointer), Arrays, Funktionen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [Tutorial] Zeiger(Pointer), Arrays, Funktionen

      1. Was ist ein Zeiger(Pointer)?
      2. Was ist eine Addresse?
      3. Wie benutze ich Pointer?
      4. Wie kann ich einen Pointer auf ein Objekt erstellen?
      5. Pointer als Parameter einer Funktion
      6. Pointer auf Klassen
      7. Schlusswort

      1. Was ist ein Zeiger(Pointer)?
      Ein Pointer ist eine Zahl die auf eine Stelle im Speicher zeigt.
      Es gibt einen besonderen Zustand den ein Pointer haben kann.
      Null-Pointer: Zeigen auf nichts (Zahlenwert: 0)
      Null-Pointer sind meist nicht initialisierte Pointer sprich Pointer die auf nichts zeigen.

      2. Was ist eine Addresse?
      Jede Variable und jedes Object in C++ hat eine Addresse an der es im Speicher liegt. Mit dem &-Operator kann man diese Addresse abrufen und z.B. in eine Pointervariable speichern.

      3. Wie benutze ich Pointer?
      Hier ein kleines Beispiel wie man Pointer benutzt.
      [cpp]
      int x = 5; //Eine Variable vom typ int(Ganzzahl)
      int *px = &x; //Ein Pointer auf x. Der * vor dem px zeigt an, dass das ein Pointer ist.
      Ausgabe(x); //Wir lassen uns den Wert von x ausgeben.
      //5

      Ausgabe(px) //Wir lassen uns den Wert von px ausgeben. Bei Pointern meist in Hex
      //z.B. 0x15b6d8ef

      //2 Wege um an den Wert zu kommen auf den ein Pointer zeigt:
      Ausgabe(*px) //Wir lassen uns den Wert auf den px zeigt ausgeben.
      //5

      Ausgabe(px[0]) //Wir lassen uns den Wert auf den px zeigt ausgeben.
      //5
      [/cpp]
      Vor einen Pointer Variablen schreibt man ein "p" damit man sich später besser zurechtfindet.

      4. Wie kann ich einen Pointer auf ein Objekt erstellen?
      In dem obigen Beispiel haben wir einen Pointer erstellt der auf ein bereits erstelltes Objekt zeigt. Im folgenden Beispiel wird gezeigt wie man ein neues Objekt erstellt und einen Pointer drauf zeigen lässt.

      [cpp]
      int *px = new int(5); //Pointer auf ein neues Objekt vom Typ int.

      Ausgabe(px) //Wir lassen uns den Wert von px ausgeben. Bei Pointern meist in Hex
      //z.B. 0x18a4b9df

      //2 Wege um an den Wert zu kommen auf den ein Pointer zeigt:
      Ausgabe(*px) //Wir lassen uns den Wert auf den px zeigt ausgeben.
      //5

      Ausgabe(px[0]) //Wir lassen uns den Wert auf den px zeigt ausgeben.
      //5
      [/cpp]

      5. Pointer als Parameter einer Funktion
      Aber wozu sind Pointer eigentlich gut?
      Man kann einer Funktion Parameter übergeben und die Funktion gibt einen Return-Value zurück. Hier gibt es 2 Probleme:
      1. Was ist wenn meine Funktion eine Liste(Array) als Parameter erwartet.
      2. Was ist wenn meine Funktion die Werte der Parameter ändern soll.

      Um diese Fragen beantworten zu können hole ich etwas weiter aus und erkläre etwas Grundlegendes zu Funktionen:
      [cpp]
      void Funktion(int i)
      {
      i++; //Den Wert von i um 1 erhöhen.
      }

      int main(void)
      {
      int x = 5; //Neue Variable x mit dem Wert von 5
      Funktion(x); //Übergeben von x an eine Funktion
      Ausgabe(x); //Ausgabe von x.
      //Anders als ihr villeicht erwartet habt ist die ausgabe 5.
      //Das ist so weil mit einer Kopie von x gearbeitet wird.
      return 0;
      }
      [/cpp]

      Wie können wir die Funktion ändern sodass sie den Wert von x ändert.
      [cpp]
      void Funktion(int *i)
      {
      i[0]++; //Den Wert auf den i zeigt um 1 erhöhen.
      }

      int main(void)
      {
      int x = 5; //Neue Variable x mit dem Wert von 5
      Funktion(&x); //Übergeben der Addresse von x an eine Funktion
      Ausgabe(x); //Ausgabe von x.
      //Der Wert von x wurde in der Funktion verändert. Die Ausgabe ist 6.
      return 0;
      }
      [/cpp]

      Damit ist beantwortet wie eine Funktion Werte ändern kann.
      Bleibt noch die Frage wie eine Funktion Arrays(Liste mit Werten) verarbeiten kann.

      Als Beispiel haben wir eine Funktion die mehrere Werte * 2 rechnen soll.
      [cpp]
      void Funktion(int *x, int *y, int *z)
      {
      x[0] = x[0] * 2;
      y[0] = y[0] * 2;
      z[0] = z[0] * 2;
      }
      int main(void)
      {
      int a = 1;
      int b = 2;
      int c = 3;
      Funktion(&a, &b, &c);
      //a ist jetzt 2
      //b ist jetzt 4
      //c ist jetzt 6
      }
      [/cpp]
      Dies ist umständlich wenn es mehr als 3 Parameter sind.

      Wir erstellen ein Array:
      [cpp]
      int ax[3] = {0}; //Ein Array mit 3 Werten (0 bis 2) mit dem Wert 0.
      ax[0] = 1; //Setzt des ersten Wertes auf 1
      ax[1] = 2; //Setzt des zweiten Wertes auf 2
      ax[2] = 3; //Setzt des dritten Wertes auf 3
      [/cpp]
      Wir haben hier einen Pointer erstellt. ax zeigt auf das erste Element des Arrays. Durch anhängen von geschweiften Klammern in der eine Zahl steht können wir auf die folgenden Elemente zugreifen

      Übergeben an eine Funktion
      [cpp]
      void Funktion(int *x)
      {
      x[0] = x[0] * 2;
      x[1] = x[1] * 2;
      x[2] = x[2] * 2;
      }
      int main(void)
      {
      int ax[3] = {0}; //Ein Array mit 3 Werten (0 bis 2) mit dem Wert 0.
      ax[0] = 1; //Setzt des ersten Wertes auf 1
      ax[1] = 2; //Setzt des zweiten Wertes auf 2
      ax[2] = 3; //Setzt des dritten Wertes auf 3
      Funktion(ax); //Übergeben eines Pointers
      //ax[0] ist jetzt 2
      //ax[1] ist jetzt 4
      //ax[2] ist jetzt 6
      }
      [/cpp]


      6. Pointer auf Klassen
      In Teeworlds gibt es viele Pointer auf Klassen. Um auf die Variablen und Funktionen einer Klasse zugreifen zu können benutzen wir bei Objekten einen "." und bei Pointern einen "->" (Pfeil).
      [cpp]
      vec2 x = m_pCharacter->m_Pos; //Schreibt den Wert von m_Pos in x
      [/cpp]


      7. Schlusswort
      Um Pointer richtig zu verstehen muss man sich diese (oder andere) Tutorials mehrmals durchlesen und viel durch praktische Erfahrungen erlernen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MAP94 ()