+ Antworten
Ergebnis 1 bis 5 von 5

C Zeiger Problem...

Eine Diskussion über C Zeiger Problem... im Forum Technik Ecke. Teil des Off Topic-Bereichs; wir haben seit geraumer Zeit C vorher halt 2 Semester JAVa aber ich komme auf diese Zeiger kacke überhaupt nicht ...

  1. #1

    C Zeiger Problem...

    wir haben seit geraumer Zeit C vorher halt 2 Semester JAVa aber ich komme auf diese Zeiger kacke überhaupt nicht klar ... wir haben z.b. ne einfach verkettete Liste ... und in Java ist das alles kein Problem bloss ich verstehe die Zeiger Syntax in C überhaupt nicht richtig .... hier mal ne Beispiel Methode :

    int einfuegen_kopf(struct listenknoten **kopf, struct listenknoten *einzufueg) {
    if ((einzufueg==NULL)||(kopf==NULL)) return -1;
    einzufueg->next = *kopf;
    *kopf = einzufueg;
    return 0;
    }

    ich verstehe zwar, was die Synatx machen soll aber die ganzen Zeiger gehen mir auf den Zeiger ... wir haben z.b. nen Parameter "struct listenknoten **kopf" das ist ja nen Zeiger auf den Zeiger aber warum benutzen wir ihn nicht ... kann mir vll. wer die Zeiger Syntax irgendwie erklären ....

    ps. wenn ihr das Beispiel oben net wollt könnt ihr mir auch eigene Beispiele zeigen, die vll. besser verständlich sind
    Geändert von blackplague (19.11.2009 um 15:54 Uhr)

  2. #2
    Oberstabsfeldwebel
    Avatar von .deviant
    Registriert seit
    01.06.2004
    Alter
    29
    Beiträge
    5.663
    Hat mich auch tierisch genervt. Deshalb enthält dieser Beitrag weder Lösungen, noch Tipps. Nur Beileid. Aber in Reinform.
    The poetry that comes from the squarin' off between
    And the circling is worth it, finding beauty in the dissonance

  3. #3
    Kampfschmuser
    Avatar von Merlin
    Registriert seit
    18.12.2001
    Beiträge
    2.178
    Clans
    OKTRON
    Stell dir dein Speicher als lineare Anordnung von Inhalten vor.

    Ein Zeiger zeigt auf eine bestimmte Stelle im Speicher (Adresse). Auf die Position eines bestimmten Inhalts.
    Ein Zeiger auf den Zeiger ist auch einfach (**kopf). Zeigt auf die Stelle im Speicher, wo der Wert des Zeigers abgelegt ist. Der Wert des Zeigers wiederum zeigt auf die Stelle im Speicher, wo der best. Inhalt sich befindet.


    Früher war sogar die Zukunft besser! - Früher litten wir unter Verbrechen, heute leiden wir unter Gesetzen

  4. #4
    Zitat Zitat von Merlin Beitrag anzeigen
    Stell dir dein Speicher als lineare Anordnung von Inhalten vor.

    Ein Zeiger zeigt auf eine bestimmte Stelle im Speicher (Adresse). Auf die Position eines bestimmten Inhalts.
    Ein Zeiger auf den Zeiger ist auch einfach (**kopf). Zeigt auf die Stelle im Speicher, wo der Wert des Zeigers abgelegt ist. Der Wert des Zeigers wiederum zeigt auf die Stelle im Speicher, wo der best. Inhalt sich befindet.
    also angenommen Kopf ist nen Struct ... dann zeigt **kopf auf den Zeiger *kopf und dieser auf den Speicher/Adresse wo kopf gespeichert ist? ... warum übergibt man dann nicht gleich kopf* sondern kopf** ?


    €dit:

    also ich hab mir jetzt mal nen Beispiel geproggt

    int a=1; a=> 1
    int *b=&a; b zeigt auf den Speicherbereich von a
    int **c=&b; c zeigt auf den Speicherbereich von b soweit klar

    printf("%d",a);
    printf("%d",*b);
    printf("%d",**c);

    jetzt nur noch die Frage zu meinem Beispiel s.h. ganz oben warum wir der Parameter kopf** genannt und dann arbeitet man nur mit kopf* ??
    Geändert von blackplague (19.11.2009 um 19:19 Uhr)

  5. #5
    Feldwebel
    Avatar von Gonzo
    Registriert seit
    13.07.2004
    Ort
    Berlin
    Alter
    46
    Beiträge
    1.669
    Zitat Zitat von blackplague Beitrag anzeigen
    int einfuegen_kopf(struct listenknoten **kopf, struct listenknoten *einzufueg) {
    if ((einzufueg==NULL)||(kopf==NULL)) return -1;
    einzufueg->next = *kopf;
    *kopf = einzufueg;
    return 0;
    }

    ... wir haben z.b. nen Parameter "struct listenknoten **kopf" das ist ja nen Zeiger auf den Zeiger aber warum benutzen wir ihn nicht ... kann mir vll. wer die Zeiger Syntax irgendwie erklären ....
    Du benutzt doch kopf. Als Dereferenzierung , ohne Dereferenzierung würdest du dem
    Zeiger nur ne neue Speicheradresse zuweisen, du willst aber der Speicheradresse einen neuen Wert zuweisen,
    *kopf soll ja nun auf eine andere Adresse zeigen.
    Dieses ** Gedösel braucht man eigentlich höchst selten und verwirrt am Anfang nur
    gnadenlos.
    Kann es sein dass in deinem Beispiel die Liste von unten nach oben gefüllt wird ?
    Finde das als solches erst mal merkwürdig. Wie wird dann in einem solchen Fall die Liste durchlaufen ?
    Und wo ist der Startpunkt ?
    Einfacher finde ich es das neue Element immer hinten anzuhängen, weiss aber natürlich
    nicht was du mit der Funktion bezweckst
    1.  
    2. // LPUSERLIST ist als *USERLIST deklariert
    3. // lpULStart ist mein globaler Startpunkt, könnte man aber natürlich auch mit
    4. // an die Funktion übergeben
    5. void AddToUserList(LPUSERLIST lpNew)
    6. {
    7. LPUSERLIST lp;
    8.  
    9. if( ! lpNew)
    10. return;
    11. lpNew->next = 0L;
    12. if( ! lpULStart) // erster Eintrag
    13. lpULStart = lpNew;
    14. else
    15. {
    16. lp = lpULStart;
    17. // Liste bis zum letzten Eintrag durchlaufen, sollte man sehr viele Einträge haben sollte
    18. // man sich was anderes ausdenken, z.B. sich den zuletzt hinzugefügten merken.
    19. while(lp->next)
    20. lp = lp->next;
    21. lp->next = lpNew;
    22. }
    23. }

    MfG
    Gonzo

+ Antworten

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 29.03.2007, 00:41
  2. ZH Maus zeiger
    Von Zocker4ever im Forum CCG/ZH Technik Ecke
    Antworten: 9
    Letzter Beitrag: 10.08.2006, 16:36
  3. Alarmstufe Rot Zeiger
    Von Zocker4ever im Forum Alarmstufe Rot 1
    Antworten: 2
    Letzter Beitrag: 09.08.2006, 21:08
  4. Problem
    Von Crassus_doèrus im Forum Generals
    Antworten: 19
    Letzter Beitrag: 26.08.2005, 11:48
  5. hab da mal ein problem :P
    Von SUCKYSUCK_ im Forum Kuschelecke
    Antworten: 26
    Letzter Beitrag: 19.01.2005, 22:25

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •