Moin,
Pointer und Listen haben insofern miteinander zu tun, daß in einer verketteten Liste ein Pointer in einem Element der Liste auf das nächste Element dieser Liste zeigt. So bastelst du dir dynamische Datentypen.
Ein Beispiel:
Du willst Adressen speichern. Könnte man ja so machen:
char adressen[256][80];
und mit
strcpy(adressen[3], "Fritze#Müller#Heimchenweg 12#04711 Adorf");
die Werte eintragen.
Nachteil dabei ist, du bist auf 80 Bytes pro Adresse beschränkt. Hast du eine längere, paßt sie nicht rein. Hast du eine kürzere Adresse, verschwendest du Platz.
Also macht man das dynamisch mit Pointern:
typedef struct adressen_struct{
char *adresse; /* <= Pointer auf Character-Feld für die Adresse */
void *next; /* <== Pointer auf das nächste Element der Liste */
} adrstruct;
adrstruct *adr; /* Der Pointer auf die gesamte Liste */
adrstruct *adr2; /* und noch ein zweiter zum zwischenspeichern `*/
adr=malloc(sizeof(adrstrucct)); /* Legt ein Element an, der Pointer adr zeigt auf den Speicherbereich */
adr->adresse=malloc(strlen(neue_adresse)+1); /* Platz für die neue Adresse in der wirklichen Länge */
strcpy(adr->adresse, neue_adresse);
adr->next=NULL; /* Hier ist die Liste zu ende. */
adr2=malloc(sizeof(adrstruct));; /* und noch eine adresse */
adr2->adresse=malloc(strlen(neue_adresse)+1); /* Platz für die neue Adresse in der wirklichen Länge */
strcpy(adr2->adresse, neue_adresse);
adr2->next=adr; /* zeigt jetzt auf das 1. Element der Liste */
adr=adr2; /* und vorne in die Liste eingehängt. */
Durchsuchen tut man eine solche Liste dann wie folgt;
adr2=adr;
for(;

{
if(adr2==NULL) break; /* Liste zu ende? Raus! */
printf("Adresse=>%s<\n", adr2->adresse);
adr2=adr2->next; /* zum nächsten (NEXT) Element der Liste springen */
}
Also, man definiert sich einen eigenen Datentyp mit typedef{}. Davon ist noch kein Speicher belegt, aber der Compiler kennt jetzt diese Datentype adrstr.
Mit adrstr *adr; legt man sich einen Pointer an. Der belegt 4 Bytes im Speicher und zeigt zur Zeit in den Wald.
Mit adr=malloc(..) holst man sich ein Stück Speicher (Memory Allocation=malloc) und malloc() liefert einen Zeiger auf das Stück Speicher. adr zeigt jetzt auf dieses Stück, auf dessen Anfangsadresse!!!
Das Stück Speicher ist so groß, wie der selbst definierte Datentyp ( sizeof(adrstr)), also 8 Bytes. 4 Bytes für den Pointer adresse und 4 Bytes für den Poiner next.
mit adr->adresse spricht man die ersten 4 Bytes des Speichers an, auf den der Pointer adr zeigt. Nämlich den, den malloc() für uns reserviert hat.
Zu beachten ist, daß C nicht kontrolliert, ob du über den reservierten Speicher hinausschreibst. Wie denn auch, ein Pointer ist nur ein Zeiger, eine Adresse. Ein Pointer kennt keine Länge.
Also, bei Pointern immer schön darauf achten, daß man nicht mehr speichern will, als das reservierte Stück Speicher wirklich groß ist. Sonst schepperts nämlich, sprich Core-Dump.
Hoffe, dir mehr Klarheit als Verwirrung bereitet zu haben. Wenn nicht, tut's mir leid
