Frage zu typedef bei Strukturen
-
Hallo!
Ich habe ein Verständnisproblem bei der Verwendung von typedef in Strukturen. Angeblich soll die Verwendung von typedef ja vorteilhafter sein, doch kann ich den Vorteil noch nicht erkennen.
Hier ein Beispiel
struct Person { int sv_nummer; char vorname[20], name[20]; char telnr[15]; int alter; } max, moritz; //Definition zweier Struktur-Variablen int main(void) { /* Zugriff auf die Struktur-Komponenten */ max.alter = 25; moritz.alter = max.alter + 2; return 0; }
Wie kann ich das Beispiel nun mit typedef lösen?
Wo liegen die Vorteile?
Wie greife ich auf die Strukturmember zu?
-
typedef struct { int sv_nummer; char vorname[20], name[20]; char telnr[15]; int alter; } Person; // Person ist nun ein anderer Name für dieses struct int main(void) { Person max, moritz; // Zwei Variablen vom Typ Person max.alter = 25; moritz.alter = max.alter + 2; return 0; }
Ist der Vorteil nun klar?
-
Ich weiss nicht genau was du meinst. Aber der Vorteil mit typedef ist folgender:
Wenn du folgenden Code hast
struct Point { float x; float y; }; int main() { struct Point p; // Hier wird das 'struct' gebraucht }
Dann braucht es in Zeile 9 das keyword 'struct'.
Wenn du nun die struct mit einem typedef hast, so kannst du das 'struct' keyword weglassen. Du hast dann:
typedef struct { float x; float y; } Point; int main() { Point p; // Hier wird das 'struct' nicht gebraucht }
Keine Ahnung ob du diesen Vorteil von typedefs in Verbindung mit struct meintest.
-
SeppJ schrieb:
typedef struct { int sv_nummer; char vorname[20], name[20]; char telnr[15]; int alter; } Person; // Person ist nun ein anderer Name für dieses struct int main(void) { Person max, moritz; // Zwei Variablen vom Typ Person max.alter = 25; moritz.alter = max.alter + 2; return 0; }
Ist der Vorteil nun klar?
Bin ich im falschen Film?? Oder ich habe keine Ahnung von C...
Ist die Referenz auf ein Feld in einer typedef struct Definition nicht
-> also: max->alter
-
confused... schrieb:
Ist die Referenz auf ein Feld in einer typedef struct Definition nicht
-> also: max->alter
1. In C gibt es keine Referenzen, sondern Zeiger.
2. max ist kein Zeiger, sondern eine direkte Instanz der struct. Dann braucht man den . Operator.
-
icarus2 schrieb:
confused... schrieb:
Ist die Referenz auf ein Feld in einer typedef struct Definition nicht
-> also: max->alter
1. In C gibt es keine Referenzen, sondern Zeiger.
2. max ist kein Zeiger, sondern eine direkte Instanz der struct. Dann braucht man den . Operator.ok, und wann benutzt man dann
->
-
confused... schrieb:
ok, und wann benutzt man dann
->
Wenn man einen Pointer hat.
Hier ein Beispiel:
int main() { Point p1; // Eine Variable vom Typ Point Point* p2 = malloc(sizeof(*p2)); // p2 ist ein Zeiger, der auf eine Variable vom Typ Point zeigt p1.x = 3; p1.y = 7; p2->x = 3; p2->y = 7; }
-
icarus2 schrieb:
confused... schrieb:
ok, und wann benutzt man dann
->
Wenn man einen Pointer hat.
Hier ein Beispiel:
int main() { Point p1; // Eine Variable vom Typ Point Point* p2 = malloc(sizeof(*p2)); // p2 ist ein Zeiger, der auf eine Variable vom Typ Point zeigt p1.x = 3; p1.y = 7; p2->x = 3; p2->y = 7; }
Korrekt, wobei den malloc braucht man nicht unbedingt....
Andererseits wirst Du fast immer die "*" (also Pointer) Variante bei typedef structs finden....
Ich wünsche allen hier ein schönes Osterfest....
-
confused... schrieb:
Andererseits wirst Du fast immer die "*" (also Pointer) Variante bei typedef structs finden....
Das zweifle ich mal ganz stark an.
-
#include <stdio.h> #include<stdlib.h> typedef struct _gugu { int blabla; } gugu; void print_hugo1 (gugu hugo1) { printf("%d\n" , hugo1.blabla); return; } void print_hugo2 (gugu *hugo2) { printf("%d\n" , hugo2->blabla); return; } int main() { gugu hugo1; gugu *hugo2 = malloc(sizeof(*hugo2)); hugo1.blabla = 100; print_hugo1(hugo1); hugo2->blabla = 200; print_hugo2(hugo2); return 0; }
Das C ist schon ne lustige Sprache....
-
confused... schrieb:
[...]
Das C ist schon ne lustige Sprache....Wieso?
-
confused... schrieb:
#include <stdio.h> #include<stdlib.h> typedef struct _gugu { int blabla; } gugu; void print_hugo1 (gugu hugo1) { printf("%d\n" , hugo1.blabla); return; } void print_hugo2 (gugu *hugo2) { printf("%d\n" , hugo2->blabla); return; } int main() { gugu hugo1; gugu *hugo2 = malloc(sizeof(*hugo2)); hugo1.blabla = 100; print_hugo1(hugo1); hugo2->blabla = 200; print_hugo2(hugo2); return 0; }
Das C ist schon ne lustige Sprache....
Wo ist die Prüfung, ob malloc() fehlschlägt ?! Wo ist das free() ?!
-
hugo2 schrieb:
Wo ist die Prüfung, ob malloc() fehlschlägt ?! Wo ist das free() ?!
Das ist doch alles überbewertet.
malloc() geht ja in den meisten Fällen gut und free()... Naja, der Speicher wird immer größer und billiger.