Seite 1 von 1
Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 12:55 am
von hardcoding
Hallo,
Es ist möglich, einen Zeiger als Rückgabewert einer Funktion zu deklarieren, so wie das bei vielen Funktionen der Standard-Bibliothek gemacht wird. Aber irgendwie verstehe ich diese Thematik irgendwie trotzdem nicht. Ich habe auch im Wiki nachgeschaut und dabei nicht gefunden.
Die Funktion selbst kann werte zurückgeben wie in diesem Beispiel:
Code: Alles auswählen
void rechne( int z1, int z2, int* erg1, int* erg2 );
int main( void )
{
int zahl1 = 4;
int zahl2 = 8;
int ergebnis1;
int ergebnis2;
rechne( zahl1, zahl2, &ergebnis1, &ergebnis2 );
return 0;
}
void rechne( int z1, int z2, int* erg1, int* erg2 )
{
*erg1 = z1 + z2;
*erg2 = z1 - z2;
}
Aber Name ein Funktion soll als Rückgabewert dienen? wie soll man das verstehen ?
Hier ein Beispiel:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
int main(void) {
char *ptr;
ptr = eingabe("Vorname");
printf("Hallo %s\n", ptr);
ptr = eingabe("Nachname");
printf("%s, interssanter Nachname\n", ptr);
return EXIT_SUCCESS;
}
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 1:35 am
von nufan
hardcoding hat geschrieben:Die Funktion selbst kann werte zurückgeben wie in diesem Beispiel:
Code: Alles auswählen
void rechne( int z1, int z2, int* erg1, int* erg2 );
int main( void )
{
int zahl1 = 4;
int zahl2 = 8;
int ergebnis1;
int ergebnis2;
rechne( zahl1, zahl2, &ergebnis1, &ergebnis2 );
return 0;
}
void rechne( int z1, int z2, int* erg1, int* erg2 )
{
*erg1 = z1 + z2;
*erg2 = z1 - z2;
}
Schlechtes Beispiel ^^ Hier wird (von main abgesehen) nirgends etwas zurückgegeben, sondern nur zugewiesen.
hardcoding hat geschrieben:Aber Name ein Funktion soll als Rückgabewert dienen? wie soll man das verstehen ?
Hier ein Beispiel:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
int main(void) {
char *ptr;
ptr = eingabe("Vorname");
printf("Hallo %s\n", ptr);
ptr = eingabe("Nachname");
printf("%s, interssanter Nachname\n", ptr);
return EXIT_SUCCESS;
}
Du verwechselst hier was... In deinem Beispiel wird einfach strtok() aufgerufen. Diese Funktion liefert dir einen Zeiger auf eine Zeichenkette zurück. Diesen Zeiger gibst du dann mit return einfach an die aufrufende Funktion zurück. "der Name der Funktion" ist hier also nicht die richtige Formulierung.
Du kannst die Methode auch so schreiben:
Code: Alles auswählen
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
char *tmp;
tmp = strtok(input, "\n");
return tmp;
}
Hilft dir das weiter?
Wo genau gibt es denn noch Verständnisprobleme?
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 1:48 am
von hardcoding
Das Problem liegt hier :
Wie soll ich den Indirection Operator vor eingabe verstehen ?
Schlechtes Beispiel ^^ Hier wird (von main abgesehen) nirgends etwas zurückgegeben, sondern nur zugewiesen.
Doch.
Die beiden werte
werden an die Funktion zurückgegeben.
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 1:55 am
von nufan
hardcoding hat geschrieben:Das Problem liegt hier :
Wie soll ich den Indirection Operator vor eingabe verstehen ?
"Indirection Operator" hab ich noch nie gehört, aber ok ^^
Das bedeutet, dass du einen Zeiger auf ein oder mehrere Elemente vom Typ char hast. Ein Zeiger ist eine Variable, die eine Adresse speichert.
hardcoding hat geschrieben:dani93 hat geschrieben:Schlechtes Beispiel ^^ Hier wird (von main abgesehen) nirgends etwas zurückgegeben, sondern nur zugewiesen.
Doch.
Die beiden werte
werden an die Funktion zurückgegeben.
Ja, hier wird aber wie gesagt nur etwas zugewiesen. Du hast auf diesen Speicherbereich auch in der aufrufenden Funktion Zugriff. Aber das ist keine "Rückgabe" im klassischen Sinne (mit return).
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 2:04 am
von hardcoding
"Indirection Operator" hab ich noch nie gehört, aber ok ^^
Naja ok.
http://msdn.microsoft.com/en-us/library ... 80%29.aspx
Das bedeutet, dass du einen Zeiger auf ein oder mehrere Elemente vom Typ char hast.
In diesem Beispiel zeigt er also auf:
oder wie
Code: Alles auswählen
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
Ein Zeiger ist eine Variable, die eine Adresse speichert.
Das ist mir schon klar.

Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 7:14 am
von cloidnerux
Ein Funktionskopf hat den Aufbau:
Und bei deinen Beispielen:
Ist
der Typ des Rückgabeparameters. Auch wenn das Sternchen vor dem Namen der Funktion steht, so gehört er doch zum char, weil eben der Funktionsname keine Variable ist.
Und wenn man sich das ganze Beispiel anschaut:
Code: Alles auswählen
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
So definierst du eine Funktion die "char *" zurückgibt und "char *" als Parameter str erwartet. Dann wird irgendwas gemacht und du gibst den "char *" den strtok zurückgibt auch wieder mit return zurück.
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 7:41 am
von hardcoding
cloidnerux hat geschrieben:Ein Funktionskopf hat den Aufbau:
Und bei deinen Beispielen:
Ist
der Typ des Rückgabeparameters. Auch wenn das Sternchen vor dem Namen der Funktion steht, so gehört er doch zum char, weil eben der Funktionsname keine Variable ist.
Und wenn man sich das ganze Beispiel anschaut:
Code: Alles auswählen
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
So definierst du eine Funktion die "char *" zurückgibt und "char *" als Parameter str erwartet. Dann wird irgendwas gemacht und du gibst den "char *" den strtok zurückgibt auch wieder mit return zurück.
Alles klar. vielen Dank
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mo Dez 03, 2012 11:46 am
von Xin
Ich kenne das im Deutschen als "Dereferenzierungs-Operator".
Der Rest scheint ja geklärt

Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mi Jan 16, 2013 5:55 pm
von mfro
Eure Beispiele sind nicht besonders gut:
Code: Alles auswählen
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
"input" ist in der Funktion "eingabe()" eine automatische Variable. D.h. sie existiert nur innerhalb des Gültigkeitsbereichs von "eingabe()". Die Funktion strtok() durchsucht innerhalb der Funktion diesen String nach einem Zeilenende-Zeichen und ersetzt das durch ein Nullbyte. Anschließend wird ein Zeiger auf den String per return an die aufrufende Funktion zurückgegeben.
Wenn die jetzt etwas mit dem String anfangen will, ist das heftig dicht an der Klippe - nach dem Verlassen der Funktion ist die Variable nicht mehr definiert. Unmittelbar danach mag das sogar noch funktionieren, aber im weiteren Programmverlauf gibt es ziemlich sicher einen Absturz oder noch schlimmer: falsche Ergebnisse.
Ein typischer Fall von "dangling pointer" (also ein Zeiger, der auf etwas ungültiges zeigt). Ein meist sehr schwer zu findender Fehler - deshalb bitte gar nicht erst angewöhnen...
Re: Pointer als Rückgabewert einer Funktion
Verfasst: Mi Jan 16, 2013 8:56 pm
von Xin
mfro hat geschrieben:Eure Beispiele sind nicht besonders gut:
Code: Alles auswählen
char *eingabe(char *str) {
char input[MAX];
printf("Bitte \"%s\" eingeben: ",str);
fgets(input, MAX, stdin);
return strtok(input, "\n");
}
"input" ist in der Funktion "eingabe()" eine automatische Variable.
Sehr aufmerksam ^^
input müsste entweder von außen reinkommen oder static sein.