Zeiger-Problem?
-
@hmpf: Ok. Dann hab ich das so nicht gemeint. Sorry, 314159265358979!
-
int main() { int * iPtr; double * dPtr; int test_int; double test_double; test_int = 5; test_double = 5.5; iPtr = (double*)iPtr; cout << *iPtr << endl << *dPtr; return 0; }Nochmal ein neuer Versuch. Ich hab grad in der Fehlermeldung gelesen, dass das irgendwie mit einem Links-Wert was zu tun haben muss. Leider funktionierts aber auch nicht...
-
vip@r schrieb:
@hmpf: Ok. Dann hab ich das so nicht gemeint. Sorry, 314159265358979!
Hoppla, jetzt muss ich mich entschuldigen. Habe dich mit Skym0sh0 verwechselt. Daher nur munter drauf auf diesen Pi.
-
Eine Variable kann ihren Typ nicht ändern. Daher wird das so auch nicht funktionieren. Außerdem zeigen deine Zeiger ins Nirvana. Und überhaupt verwendest du C-Casts.
-
@vip@r
Kannst du verbal ausdrücken, was du mit dieser Zeile erreichen willst:
iPtr = (double*)iPtr;
-
Hoppla, jetzt muss ich mich entschuldigen. Habe dich mit Skym0sh0 verwechselt. Daher nur munter drauf auf diesen Pi.
Mir ist das jetzt egal. Ich bin nicht sehr nachtragend.
Hab jetzt noch was gefunden. So geht's jetzt anscheinend. Der Sinn eines solchen "Konstrukts" bleibt mir allerdings verborgen, da das ja nix mit einer Typumwandlung zu tun hat, "wie man sie gewöhnt" ist.
int main() { int test_int = 5; int *iPtr = &test_int; double *dPtr = (double*)iPtr; cout << *iPtr << endl << *dPtr; return 0; }Es wandlet ja hier eigentlich nix um, in dem Sinn, dass man die gleiche Variable nur mit einem anderen Typ verwendete sondern viel mehr muss anscheinend nichts desto trotz eine neue Variable eingeführt werden... Irgendwie versteh ich das nicht...
-
Das bringt hier nichts. vip@r, schau dir nochmals genau an, was Zeiger sind und wie man sie verwendet. Das Gleiche für Casts. Wenn du nur ausprobierst und irgendwas zusammendichtest, kommst du nicht weiter.
Hier gibts einen guten Artikel zu Zeigern, lies ihn.
-
iPtr = (double*)iPtr;Ich wollte damit erreichen, dass die vormals int-Zeiger-Variable eine double-Zeiger-Variable wird. So wie man das mit "normalen" Variablen auch machen kann... In der Form wie:
int a; double b; (int) b;
-
Nein. Eine Variable behält ihren Typ immer. Das gilt sowohl für unqualifizierte, als auch für Zeiger und Referenzen.
-
vip@r schrieb:
2. ist richtig, @SeppJ.
Oje, da kann ich mich fast nur 314159265358979 anschließen. Jedenfalls fehlt dir mehr Verständnis über Casts, als ich mir zutraue, dir beizubringen. Falls jetzt nicht ein sehr motivierter Forenteilnehmer einen Artikel über Casts schreiben möchte, kann ich dich eigentlich nur an ein Lehrbuch verweisen. Dir fehlen jedenfalls absolute Grundlagen.
Um zu deinem Problem zu kommen: Das geht so nicht. Du kannst nicht den Typen eines Bezeichners ändern. Du kannst nur ändern, als welcher Typ sich der Bezeichner in einer bestimmten Ausdruck verhält. Das nennt man dann Casten. Und das ist eigentlich etwas, was man nur äußerst selten braucht. Vielleicht mal ein Beispiel:
Wie du sicherlich nicht weißt, haben die meisten Computersprachen eine spezielle Division für Ganzzahlen:
int a = 10; int b = 3; cout << a / b; // Ergibt genau 3!Was ist aber, wenn du lieber ein Fließkommaergebnis hättest? Dann musst du dem Compiler irgendwie klarmachen, dass a und/oder b sich in dem Ausdruck wie eine Fließkommazahl (z.B. double) verhalten sollen. Dazu kann man einen Cast benutzen:
cout << static_cast<double>(a) / b; // Ergibt 3.3333333333Das
static_cast<double>(a)macht, dass sich das a an der Stelle wie ein double verhält. Der Compiler sieht dann eine Division von double durch einen int (das b) und macht eine Fließkommadivision. Das static_cast bedeutet, dass dies eine "unproblematische" Umwandlung ist. Es ist absolut klar, dass der int mit dem Wert 10 einem double mit Wert 10. entspricht (achte auf den Punkt nach der 10). Es gibt auch noch andere Casts für andere Fälle, die erkläre ich aber hier nicht. In vielen Fällen deuten diese anderen Casts auch stark auf Designprobleme hin. Deine Pointerkonversionen die du im ersten Beitrag machen wolltest, gehen mit einem static_cast beispielsweise nicht, da braucht man den stärksten, den reinterpret_cast für, der dem Compiler sagt "ich weiß das sieht für dich nach Müll aus, aber ich weiß genau was ich da tue". Entsprechend hätte dein Programm im ersten Beitrag dann Laufzeitfehler verursacht, denn wu wusstest nicht, was du da tust.(Und noch ein Nachwort: Normalerweise würde man in dem Beispiel eher nicht casten, um eine Fließkommadivision zu erzwingen, sondern die Regeln zu Typenkonvertierungen in Rechnungen benutzen. Dazu würde man dann
1. * a / bschreiben.)edit: Da habe ich viel zu lange für den Beitrag gebraucht. In der Zwischenzeit hat sich im Thread einiges getan...
-
vip@r schrieb:
Ich wollte damit erreichen, dass die vormals int-Zeiger-Variable eine double-Zeiger-Variable wird. So wie man das mit "normalen" Variablen auch machen kann... In der Form wie:
int a; double b; (int) b;Genau das meine ich, dir fehlen essentielle Grundlagen über das C++-Typsystem. Solange du Typen und Variablen nicht verstehst, kannst du Zeiger gleich vergessen. Gesteh dir ein, dass du hier noch etwas Nachholbedarf hast, und nimm dir die Zeit, um die entsprechende Theorie nochmals gründlich anzuschauen.