als Pointer definierte Funktion
-
Hallo,
ich arbeite derzeit ein Buch zum Thema C durch und bin nun auf ein Programm gestoßen, dessen Funktionsweise mir nicht ganz klar ist.
Das Verständnisproblem liegt hierbei in der Funktion *eingabe().
Aus welchem Grund muss die Funktion *eingabe als Pointer definiert sein und warum reicht nicht der Pointer innerhalb der Funktion ( *adressen ) ?Wird die Funktion nicht als Zeiger definiert ist sie nicht nutzbar.
Die Funktion kann nun mit dem Rückgabewert "return adressen" nichts mehr anfangen.#include <stdio.h> #include <stdlib.h> #define MAX 30 struct adres { char vname[MAX]; char nname[MAX]; long PLZ; char ort[MAX]; int geburtsjahr; }; /*Funktion zur Ausgabe des Satzes*/ void ausgabe(struct adres *struct_ptr) { printf("\n\nSie gaben ein:\n\n"); printf("Vorname.........:%s",struct_ptr->vname); printf("Nachname........:%s",struct_ptr->nname); printf("Postleitzahl....:%ld\n",struct_ptr->PLZ); printf("Ort.............:%s",struct_ptr->ort); printf("Geburtsjahr.....:%d\n",struct_ptr->geburtsjahr); } struct adres *eingabe(void) { struct adres *adressen; adressen=(struct adres *)malloc(sizeof(struct adres)); printf("Vorname : "); fgets(adressen->vname, MAX, stdin); printf("Nachname : "); fgets(adressen->nname, MAX, stdin); printf("Postleitzahl : "); do {scanf("%ld",&adressen->PLZ);} while(getchar()!= '\n'); printf("Wohnort : "); fgets(adressen->ort, MAX, stdin); printf("Geburtsjahr : "); do { scanf("%ld",&adressen->geburtsjahr); }while(getchar()!='\n' ); return adressen; } int main() { struct adres *adresse1, *adresse2; adresse1=eingabe(); adresse2=eingabe(); ausgabe(adresse1); ausgabe(adresse2); return 0; }
Gruß
Mathias
-
Die Funktion ist nicht "als Zeiger definiert" (was immer das heißen mag), sondern gibt einen Zeiger auf den Typ
adres
zurück. Der Rückgabetyp ist somit( adres * )
. Nimmst du den Stern weg, so gibt Deine Funktion einadres
-Objekt zurück. Dann Stimmt der Rückgabetyp natürlich nicht länger mitstruct adres *adressen;
überein.greetz, Swordfish
-
Die Funktion heißt eingabe(). Der Stern, den du meinst, bezieht sich auf
den Rückgabewert: struct adres*.Dies ist vielleicht ein wenig einleuchtender:
struct adres * eingabe(void){ struct adres *adressen; ... return adressen; }
Gruß mcr
-
ok danke schonmal für eure Antworten, allerdings steige ich immernoch nicht so ganz dahinter.
eingabe() ist nun also eine Funktion die einen Zeiger auf den Typ adres zurückgibt.
Wie verhält es sich nun genau mit dem Zeiger "struct adres *adressen" innerhalb dieser Funktion.
Der Zeiger *adressen zeigt dann auf einen Speicherbereich der für die Struktur "struct adres" genutzt werden kann?
Der Rückgabewert "return adressen" ist also der Anfangsspeicherbereich der für die Struktur genutzt werden kann.ist das soweit richtig?
Gruß
Mathias
-
Mit
return adressen;
wird die (Anfangs-) Adresse des mitmalloc( )
reservierten Speicherbereichs zurückgegeben.greetz, Swordfish
-
alles klar, ich glaube nun habe ich es verstanden, danke.