Was bedeutet der Pfeil in C? Literaturempfehlungen?

InfDude

Cadet 4th Year
Registriert
Apr. 2016
Beiträge
95
Was bedeutet dieser Pfeil hier:

->

in C? Sehe ich oft in Verbindung mit Bäumen, Listen etc.: x->next=wert oder sowas. Was genau heißt der?

Und noch eine Frage. Habe momentan das Buch "Programmieren von Anfang an", Helmut Erlenkötter, das kleine grüne, zuhause. Passt aber nicht unbedingt mit den Inhalten meines Studiums zusammen. Die grundlegenden Sachen sind natürlich dabei, aber bei uns gehts grad los mit Bäumen, einlesen von externen Dateien etc, und darüber steht nichts im Buch

Kann jemand gute Bücher bezüglich C empfehlen? Bin gerade noch relativer Anfänger und würde mich unglaublich gerne näher mit Progammiersprachen beschäftigen (Momentan ist studiumsbedingt nur C relevant)
 
Zuletzt bearbeitet:
Das ist der Pfeiloperator und wird im Zusammenhang mit Zeigern verwendet, um z.B. auf den Inhalt einer Struktur zuzugreifen.

Äquivalent:
*(person).name = ..

person->name = ..

Gute Bücher -> Amazon ;) Einfach Mal Schauen, was dir so empfohlen wird.
 
xSeppelx schrieb:
Äquivalent:
*(person).name = ..

person->name = ..

Falsche Klammerung, bei Yuuri wars richtig.
So wie du das geschrieben hast, würde das Programm versuchen person.name zu dereferenzieren, was nicht geht, da person ein Zeiger auf eine Struktur und keine Struktur ist.
 
Als Buchempfehlung: Robert Sedgewick - Algorithmen in C - der Typ ist echt der Godfather of Algorithmen. (das Buch gibt es gebraucht schon ab 20€ bei Amazon)
 
_killy_ schrieb:
Als Buchempfehlung: Robert Sedgewick - Algorithmen in C - der Typ ist echt der Godfather of Algorithmen. (das Buch gibt es gebraucht schon ab 20€ bei Amazon)

Vielen Dank! Ich werds mir mal angucken

Und auch danke für die Erklärungen, gleich noch eine Frage hinterher: Wenn ich auf zB die Wurzel eines Baums zugreifen möchte, geht das ja so:

Baum->Wurzel

Wenn ich jetzt aber, wenn die Wurzel (oder irgendein Knoten) einen Wert hat, zB x, diesen mit irgendwas vergleichen möchte, zB y, geht das so:

if Baum->Wurzel->x == y

oder muss man das anders machen?
 
Das solltest du nur machen, wenn du garantieren kannst, dass weder Baum noch Baum->Wurzel den Wert NULL haben. Ansonsten immer prüfen.
 
Ich habe das Gefühl deine Frage ist viel zu spezifisch obwohl dir noch andere Grundlagen fehlen.

Du solltest erstmal versuchen zu verstehen was der Unterschied zwischen Referenzen und Pointern ist.
 
Oops, da hab ich implizit angenommen wir reden von C++. Mein Fehler.
Trotzdem macht es mir den Anschein als fehlen dem OP noch einige Grundlagen.
 
M@C schrieb:
Ich habe das Gefühl deine Frage ist viel zu spezifisch obwohl dir noch andere Grundlagen fehlen.

Du solltest erstmal versuchen zu verstehen was der Unterschied zwischen Referenzen und Pointern ist.

Falsch, da ist kein Unterschied - da Referenz identisch zu Pointer ist. Siehe Disassembly und zugehörigen Code:

Code:
int intValue = 0;
012F347E  mov         dword ptr [intValue],0  
	changeIntAsPointer(&intValue);
012F3485  lea         eax,[intValue]  
012F3488  push        eax  
012F3489  call        changeIntAsPointer (012F2D60h)  
012F348E  add         esp,4  
	changeIntAsReference(intValue);
012F3491  lea         eax,[intValue]  
012F3494  push        eax  
012F3495  call        changeIntAsReference (012F2DA0h)  
012F349A  add         esp,4

Code:
static void changeIntAsPointer(int *intPtr) {
	*intPtr = 4;
}
static void changeIntAsReference(int &intPtr) {
	intPtr = 4;
}
int main(int argc, char **args) {
	int intValue = 0;
	changeIntAsPointer(&intValue);
	changeIntAsReference(intValue);
}
 
Nein, das ist nicht falsch.
Beide haben unterschiedliche Semantik und Syntax und somit aus Sicht des Anwenders Unterschiede.
Wenn schon Klugscheißen dann bitte richtig.
Aber wie driften ab, wie bereits geschrieben dachte ich es handle sich um C++.
Und mein Beispiel war auch eher dazu gedacht den OP anzuregen etwas weiter vorne anzufangen an statt schlichtweg zu verstehen, was jedes Symbol im Code bedeutet.
 
Zuletzt bearbeitet:
The Ripper schrieb:
​hier vielleicht nicht, doch es gibt durchaus Unterschiede...
​sh. google...

Der C Compiler sieht das aber nicht so, siehe Dissassembly und ob ich jetzt * oder & schreibe, das ist für mich kein Unterschied. Klar ist ein anderer Buchstabe, produziert aber den gleichen Code - zumindest in C. In anderen Sprachen mag das anders sein.

Heißt aber nicht das Referenzen schlecht sind, ganz im Gegenteil:

Code:
Vec2f V2Add(const Vec2f &a, const Vec2f &b) {
  Vec2f result;
  result.x = a.x + b.x;
  result.y = a.y + b.y;
  return(result);
}

ist bequemer und einfacher zu lesen als:

Code:
Vec2f V2Add(Vec2f *a, Vec2f *b) {
  Vec2f result;
  result.x = *a.x + *b.x;
  result.y = *a.y + *b.y;
  return(result); 
}

Aber ja, wir schweifen ab, Frage ist ja bereits beantwortet.

Schöne Feiertage, bin raus.
 
Zuletzt bearbeitet:
Der C Compiler sieht das aber nicht so, siehe Dissassembly und ob ich jetzt * oder & schreibe, das ist für mich kein Unterschied. Klar ist ein anderer Buchstabe, produziert aber den gleichen Code - zumindest in C. In anderen Sprachen mag das anders sein.

​Nur weils gleiche rauskommt heißt es nicht, dass es das gleiche ist...
​Ein Goldohrring und ein Goldring ist auch nicht das selbe, obwohl der Schmelzofen daraus das selbe machen würde...
 
Vielen Dank für die Antworten! Gut dass der Hinweis mit Referenzen, Pointern etc. gefallen ist. Das nochmal genauer nachzugucken hat geholfen. Ich habe dennoch noch eine Frage und möchte nicht extra einen neuen Thread dafür erstellen. Undzwar funktioniert meine Insert_Funktion für einen Binärbaum nicht wie gewünscht und ich komme einfach nicht dahinter, wo der Fehler liegt. Mein Code sieht wie folgt aus:

Code:
void bst_insert_node(bstree* bst, unsigned long phone, char *name) {

bst_node* tmp=bst->root;
bst_node* x=NULL;

if (bst->root==NULL) {
        tmp=(bst_node*)malloc(sizeof(bst_node));
        tmp->phone=phone;
        tmp->name=name;
        tmp->right=tmp->left=NULL;
        bst->root=tmp;
        }
else  {

while(tmp!=NULL) {
        x=tmp;

        if (phone < tmp->phone) {
                tmp = tmp->left;
                }
        else if (phone > tmp->phone) {
                tmp = tmp->right;

        }

        else {
        printf("ERROR\n");
        return;
        }

}

tmp=(bst_node*)malloc(sizeof(bst_node));
tmp->phone=phone;
tmp->name=name;
tmp->left=tmp->right=NULL;
tmp->parent=x;

}

Die Knoten haben jeweils eine Nummer und einen Namen (phone, name), die aus einer Datei ausgelesen werden. Dies funktioniert an sich alles, aber nur für den ersten Knoten, also wenn der Baum leer ist. Demnach müsste der Fehler ja irgendwo nach dem "else" sein, aber wo? Es kommen auch keine Errors o.Ä. also muss der Fehler ja irgendwo Semantisch sein. Ich finde ihn aber nicht :(
 
Zuletzt bearbeitet:
Edit: Hier stand mist. Ist schon spät :D
 
Dein Binary Tree scheint mir nicht wirklich sauber durchimplementiert zu sein.

Wieso hat deine Struktur ein "parent" Feld? Üblich ist das für Binary Trees nicht. Jeder Knoten weiß über seine Kinder bescheid, nicht anders herum.

Implementiere das Insert doch so:

https://en.wikipedia.org/wiki/Binary_search_tree#Insertion

Ergänzung:
Falls du deinen (schlecht eingerückten) Code behalten willst: Woher weiß denn "x", was seine Kinder sind? Das hast du bei deiner Implementation nicht berücksichtigt.
 
@CryNickSystems: Afaik sind parent pointer nicht wirklich ungewöhnlich wenn man durch die Elemente iterieren will. Kommt halt immer darauf an, für welchen Einsatzzweck man seine datenstrukturen optimiert.
 
Zurück
Oben