Dynamisch allokierte Strukturen
-
Hallo,
wenn ich ein verkettete Liste definiere, und dynamisch
allokiere, was bekomme ich zurueck, wenn ich
einerseits t->next schreibe
und andererseits t.next, wobei next ein Zeiger
auf ein anderes Listenelement, dass auf die gleiche
Definition zurueckgreift, ist.
Und was ist, wenn ich eine Struktur statisch deklariere
und innerhalb der struktur ein Zeiger auf int ist, dem
ich Speicherplatz zugewiesen habe. wenn ich da jetzt den
inhalt will, greife ich da bloss mit struktur.*intelem zu?
Oder bekomme ich dann mit struktur->intelem auch den Wert
zurueck, der an der Stelle ist, wo der int-zeiger hinweist?
und bekomme ich dann mit struktur.intelem dann den zeiger
auf die Stelle zurueck?
Bisher konnte ich das nicht eindeutig herausfinden, was was macht,
auch wenn es eigentlich recht leicht zu sein scheint
-
Ich weiß nicht, ob ich deine Frage richtig interpretiere (ist nicht ganz einfach, du schreibst ziemlich unkoordiniert), aber eigentlich gibts dazu nicht mehr zu wissen, also dass A->B gleichbedeutend mit (*A).B ist.
-
Es ist doch so. Wenn ich, sagen wir einen int Zeiger deklariere und ihm Speicher zuweise, gibt es ja die Moeglichkeit den Wert zurueckbekommen, auf den der Zeiger zeigt, mittels *iptr, oder direkt die Adresse, die in der Variable ist, zu bekommen (einfach iptr, ohne alles). Jetzt wollte ich gerne wissen, wenn ich eine dynamisch allokierte Struktur habe, in der wiederrum ein ein Zeiger auf eine dynamische Struktur (nennen wir sie s2) ist, bekomme ich ja die dynamische Struktur selbst zurueck mittels struktur->next, oder?
Wenn ich jetzt aber bloss den zeiger auf diese struktur s2 will, schreibe ich dann
struktur.next oder wie?
-
Du schreibst:
Object * struktur; struktur->next
oder
Object struktur; struktur.next;
und wenn next ein Zeiger ist bekommst du in beiden Faellen einen Zeiger.
Gruß
Entyl Sa
-
the_menace schrieb:
Es ist doch so. Wenn ich, sagen wir einen int Zeiger deklariere und ihm Speicher zuweise, gibt es ja die Moeglichkeit den Wert zurueckbekommen, auf den der Zeiger zeigt, mittels *iptr, oder direkt die Adresse, die in der Variable ist, zu bekommen (einfach iptr, ohne alles). Jetzt wollte ich gerne wissen, wenn ich eine dynamisch allokierte Struktur habe, in der wiederrum ein ein Zeiger auf eine dynamische Struktur (nennen wir sie s2) ist, bekomme ich ja die dynamische Struktur selbst zurueck mittels struktur->next, oder?
Wenn ich jetzt aber bloss den zeiger auf diese struktur s2 will, schreibe ich dann
struktur.next oder wie?#include <stdio.h> struct test { int a; int b; }; int main() { struct test eins; struct test *p; eins.a = 2; eins.b = 0xbeef; p = & eins; if(eins.a == p->a) puts("Gleicher Wert bei eins.a und p->a"); return 0; }
-
the_menace schrieb:
Jetzt wollte ich gerne wissen, wenn ich eine dynamisch allokierte Struktur habe, in der wiederrum ein ein Zeiger auf eine dynamische Struktur (nennen wir sie s2) ist, bekomme ich ja die dynamische Struktur selbst zurueck mittels struktur->next, oder?
Also so?
struct s2 { ... }; struct s1 { struct s2 * zeiger; }; struct s1 * struktur = malloc(sizeof *s1);
?
Dann bekommst du mit struktur->zeiger den Wert des Zeigers, also die Adresse, auf die er zeigt. Willst du aus irgendeinem Grund den Wert, auf den der Zeiger zeigt, schreibst du, wie immer, ein * davor: *struktur->zeiger. Keine Angst, das funktioniert schon, der .Operator zieht stärker als der *Operator, das ist also gleichbedeutend mit *(struktur->zeiger)
Falls das nicht das ist, was du wissen willst, bring mal ein wenig Code ...
-
#include <stdio.h> struct node { int key; struct node *next; }; struct node *insertafter(int v,struct node *t) { struct node *x; x=(struct node *)malloc(sizeof(struct node *)); /* speicher bereitstellen */ x->key=v; /* wert zuweisen */ x->next=t->next; /* kann ja mittendrin eingefuegt werden, also zeiger dem neuen element geben */ t->next=x; /* jetzt den zeiger aufs neue element */ return x; /* gib aktuellen knoten zurueck */ } /* fertig ist eine weiteres anonymes Element der Liste */ int main(int argc, char *argv[]) { struct node *first=(struct node *)malloc(sizeof(struct node *)); first->key=1; struct node *z=insertafter(2,first); z->next=first; printf(" zkey %i , firstkey %i\n",z->key,z->next->key); printf(" zpoint %i , znextpoint %i , firstpoint %i\n", *z->next, *(z->next)->next, *first->next); return 0; }
Also, dann gibt mir *z->next die Adresse aus, an der die Adresse liegt, die auf first zeigt?
und *(z->next)->next sollte doch die Adresse zeigen, an der die Adresse zu z liegt? aber sollte dann nicht *first->next auch diese Adresse ausgeben?
denn das zweite und dritte sollte doch equivalent sein?Vielen dank fuer die hilfe
-
Könnte ich ein wenigstens ein "punktx: ja usw" oder ein "Punktx: nein" oder "geh weg" als antwort bekommen? nicht dass es zeitlich drängt, aber mir brennt diese Unsicherheitsgefühl in den Fingern