C Zeiger Problem...

Joined
Apr 8, 2007
Messages
6,474
Reaction score
0
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
 
Last edited:
Hat mich auch tierisch genervt. Deshalb enthält dieser Beitrag weder Lösungen, noch Tipps. Nur Beileid. Aber in Reinform.
 
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.
 
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* ??
 
Last edited:
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 :p, 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 ;)
C:
// LPUSERLIST ist als *USERLIST deklariert
// lpULStart ist mein globaler Startpunkt, könnte man aber natürlich auch mit 
// an die Funktion übergeben
void AddToUserList(LPUSERLIST lpNew)
{
	LPUSERLIST lp;
        
        if( ! lpNew)
                return;
	lpNew->next = 0L;
	if( ! lpULStart) // erster Eintrag
		lpULStart = lpNew;
	else
	{
		lp = lpULStart;
// Liste bis zum letzten Eintrag durchlaufen, sollte man sehr viele Einträge haben sollte 
// man sich was anderes ausdenken, z.B. sich den zuletzt hinzugefügten merken.
		while(lp->next) 
			lp = lp->next;
		lp->next = lpNew;
	}
}
 
Back
Top