Zeiger/ Pointer



  • Hey Leute,
    ich lerne gerade C und verstehe einfach nicht wofür man einen Zeiger benötigt. Das ich mit & den Adressbereich der Variablen rausbekomme und dieses nützlich sein kann ok. Aber wofür allgemein ein Zeiger?
    Hat jemand von Euch ein gutes und einfaches Beispiel auf Lager damit ich das verstehe?
    LG und besten Dank 🙂



  • void foo(int *p)
    {
      *p = 5;
    }
    
    int main()
    {
      int a = 3;
      foo(&a);
      return 0;
    }
    

    Ohne Zeiger wäre es nicht möglich, a innerhalb von foo zu verändern.



  • Hmmm aber was soll das Programm jetzt bringen?

    Habe ne Funktion namens foo, in der ein Zeiger p auf int zeigt, in der Main wird foo die Adresse von a übergeben und dann?



  • Du wolltest ein einfaches Beispiel, also hast du eins bekommen 😉

    Der Punkt ist, daß ein Programm übersichtlicher ist, wenn du es in Funktionen aufteilst. Und da kommt es auch vor, daß eine Funktion Werte an das aufrufende Programm übergeben will - also braucht sie eine Möglichkeit, Variablen des Hauptprogramms zu ändern.

    Ein anderes Anwendungsgebiet ist dynamisch reservierter Speicher:

    int size;
    printf("Wieviele Elemente wollen Sie anlegen?\n");
    scanf("%d",&size);
    mystruct* daten = malloc(size*sizeof(maystruct));
    


  • So eine Art Veerbung wie in der Objektorientieren Sprache, nur dieses dann halt innerhalb einer Klasse? Also anders ausgedrück dass ich von der main auf die Funktion zugreifen kann?!



  • Nichts mit Vererbung. Die Funktion kriegt mitgeteilt wo die Variable liegt und kann diese dadurch ändern.

    Was immer auch die Objektorientieren Sprachen vor die verstecken, intern arbeiten die auch mit Zeigern.
    C stammt halt aus einer anderen Zeit. Da musste man schon ein bisschen auf Speicherplatz achten.
    Heute ist es kein Problem mal eben 100 KiBi auf den Stack zu packen. 'Damals' war der Stack halt nur 64 KiBi oder auch nur 255 Byte groß. Ein Zeiger sind halt nur 2 bis 8 Byte.



  • earthhero schrieb:

    So eine Art Veerbung wie in der Objektorientieren Sprache, nur dieses dann halt innerhalb einer Klasse?

    Nein, mit Vererbung hat das nichts zu tun.

    Also anders ausgedrück dass ich von der main auf die Funktion zugreifen kann?!

    Von main() aus kannst du sowieso auf jede Funktion zugreifen. Hier geht es darum, daß die Funktion auf Variablen zugreifen kann, die innerhalb der main() existieren.



  • earthhero schrieb:

    So eine Art Veerbung wie in der Objektorientieren Sprache, nur dieses dann halt innerhalb einer Klasse?

    Das wäre schon sehr weit hergeholt 😉

    earthhero schrieb:

    Also anders ausgedrück dass ich von der main auf die Funktion zugreifen kann?!

    Von der main kannst du natürlich auf die Funktion zugreifen. Der Sinn ist, dass du (bei meinem Beispiel) den Wert einer Variablen von main außerhalb der main Funktion ändern kannst. Das ist anders nicht möglich.

    Edit:
    Du willst eine Funktion die etwas "Sinnvolles" macht?

    void my_strcpy(char *dst, const char *src)
    {
      while (*src)
        *dst++ = *src++;
      *dst = *src;
    }
    
    int main()
    {
      char buf[0x100];
      my_strcpy(buf, "Hallo, Welt!");
      puts(buf);
      return 0;
    }
    

    Würde ich jetzt aber nicht mehr als "einfaches Beispiel" durchgehen lassen 😃

    Edit:
    Wenn dir das immer noch nicht einleuchtet, programmier halt mal irgendetwas in C. Du wirst schnell merken, dass man ohne Pointer doch recht wenig machen kann.

    Und globale Variablen sind böse 😉



  • C ist eine typisierte Sprache und Zeiger sind hier für die Bearbeitung von Adressen gedacht und durch

    Typ * zeigername
    

    gekennzeichnet.
    Wenn du also mit Adressen arbeiten willst, musst du dies dem Compiler z.B. mit einem Zeiger bekanntgeben, bei Deklarationen aber spätestens bei Definitionen von Variablen, Parameterlisten usw.


Anmelden zum Antworten