Heutiges Thema: Zeiger ssh ckurs@217.197.81.36 Kurswebseite: http://fuz.su/~fuz/ckurs Resource: Blinky Pointer Fun (vgl. Kurswebseite) Ein Zeiger ist die Adresse eines Objektes. Deklaration eines Zeiger: typ *name; Bestimmung eines Zeigers auf ein Objekt: &objekt Bestimmung des Objektes, auf das ein Zeiger zeigt: *zeiger Zugriff auf Felder eines Zeigers auf Strukturen: (*struktur_zeiger).feld /* ist identisch zu */ struktur_zeiger->feld Ein Zeiger auf void zeigt auf ein Objekt beliebigen Types: void *zeiger; Ein Zeiger auf void kann nicht ohne weiteres dereferenziert werden. Er muss zunächst in einen Zeiger auf einen konkreten Typen umgewandelt werden: void *zeiger = ...; test = *(int *)zeiger; Der Nullzeiger zeigt auf kein Objekt: zeiger = NULL; definiert in . NULL ist definiert als: (void *)0 oder 0 Ein Null-Zeiger darf nicht dereferenziert werden. test = *(int *)NULL; /* VERBOTEN! */ malloc() alloziert Speicher: void *malloc(size_t n); n ist die Größe des zu allozierenden Speichers. Beispielanwendung: struct person *pers = malloc(sizeof *pers); struct person *pers = malloc(sizeof (struct person)); Zur Freigabe des Speichers wird free() verwendet: free(pers); /* gibt das Objekt, auf das pers zeigt, frei */ Das Argument von free() muss stets ein Zeiger sein, der von malloc() zurückgegeben wurde. int x; free(&x); /* unzulässig */ Wenn malloc() keinen Speicher allozieren konnte, so gibt es NULL zurück. Dieser Fall muss immer überprüft werden: pers = malloc(sizeof *pers); if (pers == NULL) { fprintf(stderr, "malloc() schlug fehl!\n"); exit(EXIT_FAILURE); } Hausaufgabe: * Erweitere person.c, sodass es die Eingabe zunächst in eine verlinkte Liste einließt und dann, wenn die gesamte Eingabe vorliegt, in einem Rutsch ausgibt.