Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Ich habe das Beispiel bei Wikipedia jetzt mal auf die einfachste Art repariert, die mir einfiel: static int zahl statt int zahl.
TigerClaw25
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
int *funktion(void) { int zahl = 3; int *zeiger = &zahl; return zeiger; /* hier wird ein Zeiger zurückgegeben */ } main() { int *zeiger; zeiger = funktion(); printf("%d\n", *zeiger); /* gibt „3“ aus */ } |
Administrator
Danach übergebe ich die Adresse dem Zeiger und gebe diesen zurück. Danach wird die Funktion verlassen. Geht das überhaupt??? Nach meinem jetzigen wissen ist "Zahl" eine lokale variable. Rufe ich die Funktion erneut in der Main auf, zeigt der Zeiger auf eine neue Adresse. Deshalb werden oft statische Variablen verwendet, die zwar auch lokal erzeugt werden, aber ihre feste Adresse haben, ist das richtig?
Und zum Punkt vorher, der beantwortet wurde, verstehe ich nicht wieso es falsch ist, dass in der Main die zurück gegebene Adresse einem Zeiger zugeordnet wird wie in dem beispielcode hier in der Main. Das steht in sehr viele Büchern so
C-/C++-Quelltext |
|
1 |
printf("%d\n", *funktion()); |
TigerClaw25
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> using namespace std; int *funktion() { int zahl = 3; int *zeiger = &zahl; return zeiger; /* hier wird ein Zeiger zurückgegeben */ } int main() { int *zeiger; zeiger = funktion(); cout << zeiger << endl; // Zeiger zeigt auf Adresse mit Inhalt "3" *zeiger = *zeiger + 10; // Inhalt, auf das Zeiger zeigt, kann nicht um 10 addiert werden, da nicht definiert cout << *zeiger << endl; cout << funktion(); // Gleiche (Zufall) oder neue Adresse Adresse durch lokale Variable und lokale Zeigervariable von Funktion, Wert wieder 3 system("Pause"); return 0; } |
Administrator
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
cout << "1: " << funktion() << endl; cout << "2: " << funktion() << endl; { int x = 42; cout << "3: " << funktion() << endl << "nicht wichtig: " << x << endl; } cout << "4: " << funktion() << endl; |
Quellcode |
|
1 2 3 4 5 |
1: 004FF82C 2: 004FF82C 3: 004FF820 nicht wichtig: 42 4: 004FF82C |
TigerClaw25
unregistriert
C-/C++-Quelltext |
|
1 2 3 |
char array[30] = "Test"; char *ptr = nullptr; ptr = array; |
C-/C++-Quelltext |
|
1 |
char *ptr = "Test"; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
char *funktion(char *text) { static char neu[100]; char *zeiger; zeiger = neu; zeiger = text; return neu; /* hier wird ein Zeiger zurückgegeben */ } int main() { char string[100] = "tester"; char *ptr = nullptr; ptr = string; ptr = funktion("Test"); cout << ptr << endl; system("Pause"); return 0; } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (11.07.2017, 16:58)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
TigerClaw25
unregistriert
Aber prinzipiell sollte es funktioniert per Zuweisung ptr = string; auf das String zu zeigen, außer ist würde einzelnen Elemente ansprechen, dann bräuchte ich eine Schleife für den Durchlauf aller Elemente ...
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dann zeigt aber 'ptr' auf String und nicht 'ein_anderer_ptr', wie du es bei deinem Beispiel erwartet hast. Mal davon abgesehen, dass du da nur lokale Variablen änderst und die sind beim Verlassen der Funktion futsch. Erst zeigt 'zeiger' eben auf 'neu' und danach lässt du ihn auf 'text' zeigen. Und am Ende gibst du 'neu' zurück, der überhaupt nie irgendwie geändert wurde. Warum sollte der also auf irgendwas anderes zeigen als auf seine 100 Charakter (die übrigens im Release-Mode mit Zufallsdaten gefüllt sind)?Das Beispiel ist etwas verwirrend. Aber prinzipiell sollte es funktioniert per Zuweisung ptr = string; auf das String zu zeigen, außer ist würde einzelnen Elemente ansprechen, dann bräuchte ich eine Schleife für den Durchlauf aller Elemente ...
Werbeanzeige