typedef struct < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Habe eine Frage zu structs und typedef. Ich kannte bisher nur folgende Form:
typedef struct
{
int tag;
char monat[10];
int jahr;
} Datum;
Nun könnte ich mit
Datum geburtstag;
ein Struct mit Namen "geburtstag" vom Typ "Datum" erzeugen.
Nun habe ich jedoch folgendes gesehen:
typedef struct l_knoten
{
int l_daten;
struct l_knoten *l_next;
} L_knoten;
Also einmal ein Name vor den geschweiften Klammern und einmal dahinter (l_knoten bzw. L_knoten). Wo ist der Unterschied bzw. welche Funktionen haben die beiden Namen?
Vielen Dank für eure Hilfe!
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:37 So 20.04.2008 | Autor: | Auron2009 |
weiß vielleicht doch noch jemand eine Antwort? Danke!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:15 So 20.04.2008 | Autor: | andihit |
Hi,
Mit
typedef struct l_knoten
{
int l_daten;
struct l_knoten *l_next;
} L_knoten;
Deklarierst du in deiner Struktur einen Zeiger auf die eigene Struktur (in der Definition "l_knoten").
Wenn du
typedef struct
{
int l_daten;
struct L_knoten *l_next;
} L_knoten;
schreiben würdest, gibt's später bei der Zuweisung folgende Warnung: "assignment from incompatible pointer type".
Weil der Compiler das L_knoten noch nicht kannte bei der Deklarierung (merkwürdigerweise kann man bei der Definition auch "struct irgendwas *l_next;" schreiben, und die Warnung kommt erst bei der Zuweisung ... der C Compiler ist eben nicht gesprächig ;))
|
|
|
|
|
Also ist das l_knoten nur ein Name, damit der Compiler weiß auf was der Zeiger im Struct zeigen soll. Also sind sowohl l_knoten als auch L_knoten Namen für den struct.
Könnte man jetzt später im Programm auch mittels "struct l_knoten irgendwas" ein Struct erzeugen oder geht das weiterhin nur mit "struct L_knoten irgendwas"?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:30 Mo 21.04.2008 | Autor: | rainerS |
Hallo!
> Also ist das l_knoten nur ein Name, damit der Compiler weiß
> auf was der Zeiger im Struct zeigen soll. Also sind sowohl
> l_knoten als auch L_knoten Namen für den struct.
Nein, nicht ganz. l_knoten ist ein Name (Tag), der nur in Verbindung mit dem speziellen Wort struct auftreten kann. L_knoten ist ein Typ, der durch typeder deklariert wurde. Das Tag dient nur dazu, verschiedene Deklarationen miteinander in Verbindung zu bringen. Zum Beispiel funktioniert auch folgendes:
typedef struct l_knoten L_knoten
(Hier wird der Typ L_knoten als ein struct mit Namen l_knoten deklariert. Das ist eine unvollständige Deklaration.)
1: | struct l_knoten
| 2: | {
| 3: | int l_daten;
| 4: | struct l_knoten *l_next;
| 5: | };
|
(Hier wird die Deklaration vervollständigt. Von nun an kann man Variablen definieren.)
> Könnte man jetzt später im Programm auch mittels "struct
> l_knoten irgendwas" ein Struct erzeugen oder geht das
> weiterhin nur mit "struct L_knoten irgendwas"?
struct L_knoten ist falsch, denn L_knoten ist ja schon ein Typ. Die korrekte Definition einer Variablen wäre
L_knoten var1;
oder
struct l_knoten var1;
Viele Grüße
Rainer
|
|
|
|