Warum geht das nicht?
-
Hallo!
Warum gibt mir dieses Programm nichts aus?
#include <iostream> using namespace std; void foo(int *a) { a = new int; *a = 4; } int main() { int* a = NULL; foo(a); if (a != NULL) cout << *a; int asd; cin >> asd; return 0; }
In foo wird doch Speicher angelegt und dann auf 4 gesetzt? aber anscheinend hat der Pointer in main davon gar nichts mitgekriegt?!
Warum?
Danke für die Hilfe
-
machste so:
void foo(int **a) { *a = new int; **a = 4; }
...und dann...
foo(&a);
-
verwiiiierert schrieb:
In foo wird doch Speicher angelegt und dann auf 4 gesetzt? aber anscheinend hat der Pointer in main davon gar nichts mitgekriegt?!
Wegen der Übergabe by value.
So sieht das schon anders aus:
void foo(int *&a) { a = new int; *a = 4; }
-
Wegen der Übergabe by value.
Aha schon klar aber was kann bei einem Pointer als Value übergeben werden? Er hat ja nur ne Adresse und wenn die per value übergeben wird müsste das doch keine auswirkungen haben?!???
-
Der Pointer wird by value übergeben, d.h. in der Funktion existiert eine Kopie des Originalpointers. Diese wird dort zwar verändert, aber das überträgt sich natürlich nicht auf das Original. Eigentlich genau das gleiche wie bei jedem anderen Typ, lass dich nicht davon verwirren, dass es ein Pointer ist.
-
verweierrt schrieb:
Wegen der Übergabe by value.
Aha schon klar aber was kann bei einem Pointer als Value übergeben werden? Er hat ja nur ne Adresse und wenn die per value übergeben wird müsste das doch keine auswirkungen haben?!???
Du übergibst die Adresse by value.
Wenn du nun die adresse änderst, gehen die änderungen vorloren, weil du ja nur mit einer kopie arbeitest.Wenn du aber die Werte änderst, die bei dieser Adresse liegen gehen die Änderungen nicht verloren, weil du ja nicht mit kopien arbeitest.
-
Aber der Pointer hat in der Funktion noch die gleiche Adresse also handelt es sich doch um den gleichen Pointer?!?!?
void foo(int *a) { cout << "adr von a: " << &a << endl; } int main() { int* a = NULL; cout << "adr von a: " << &a << endl; foo(a); if (a != NULL) cout << *a; int asd; cin >> asd; return 0; }
-
Sicher? Dann wirf deinen Compiler weg
-
Ähm Microsoft Visual C++.net...
Es gibt die gleiche Adresse aus also muss es stimmen
-
verweieiert schrieb:
Aber der Pointer hat in der Funktion noch die gleiche Adresse
Ganz sicher? Ich erhalte mit Visual C++ 7.1 zwei unterschiedliche Adressen:
adr von a: 0012FED4
adr von a: 0012FDF4
-
Oh tut mir leid habe zu schnell geguckt! Als Ausgabe war:
adr von a: 0012FED4 adr von a: 0012FDF4
Wenn man da schnell schaut kann das passieren... Bitte um entschuldigung und ich habe verstanden. Danke für die schnellen Antworten
-
verweieiert schrieb:
Aber der Pointer hat in der Funktion noch die gleiche Adresse also handelt es sich doch um den gleichen Pointer?!?!?
auf welchem prozessor läuft das so? vielleicht sind's relative adressen (sind ja keine globalen variablen)