Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » [Error] invalid conversion from 'int' to 'int*' [-fpermissive]

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.05.2022, 18:57 Uhr
Data2006



Moin Leute.

Ich habe bischen Probleme mit C++.
Folgendes Programm läuft:

C++:
#include <iostream>
using namespace std;
int main()
{
    int *z;
    int a=5;
    z=&a;
    cout << "z = " << *z;
}



Aber bei diesem gibts Fehlermeldung. Ich benutze Dev-C++ 5.11

C++:
#include <iostream>
using namespace std;
int main()
{
    int *z=5;
    cout << "z = " << *z;
}



[Error] invalid conversion from 'int' to 'int*' [-fpermissive]

Mir ist klar z ist ein Zeiger auf ein int-Objekt. Also in z steht nicht der Wert der Variablen, sondern eine andere Speicheradresse. Und erst in dieser steht der Wert.
Dachte man kann einen Zeiger bei der Definition direkt in einem initialisieren?!

Liegt das an C oder C++ ?

Lieben Dank, Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.05.2022, 19:44 Uhr
f.-th.




Zitat von Data2006:
...

C++:
#include <iostream>
using namespace std;
int main()
{
    int *z=5;
    cout << "z = " << *z;    // kann man das so schreiben?
}



[Error] invalid conversion from 'int' to 'int*' [-fpermissive]

Mir ist klar z ist ein Zeiger auf ein int-Objekt. Also in z steht nicht der Wert der Variablen, sondern eine andere Speicheradresse. Und erst in dieser steht der Wert.
Dachte man kann einen Zeiger bei der Definition direkt in einem initialisieren?!
...


Du wolltest zu viel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.05.2022, 00:08 Uhr
Data2006



Hi.

Neee, ich glaube so geht es nicht. Ich definiere ja zuerst einen Zeiger und versuche direkt ein Wert speichern. z wird aber mit ner Speicheradresse angelegt.
So gehts auch nicht:

C++:
#include <iostream>

int main()
{
    int *z;
    *z = 5;
    
    std::cout << "z = " << *z << std::endl;
}


Wenn ich Zeiger definiere, wird der Zeiger ja nicht auf eine bestimmte Speicheradresse gelegt. Glaube ich muß den Zeiger erst auf die Speicheradresse legen. Nur, wie mache ich das manuell auf eine Speicheradresse, ohne &variable und z=&variable.

Gute Nacht,
Data2006
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.05.2022, 13:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi


C++:
int *z=5;



hier weißt du z die adresse 5 zu. Das ist etwas was ein aktueller compiler so nicht zulässt. (Direkte adressierung ist zu fehleranfällig und auch durch die Speichermodelle der Betriebsysteme so gar nicht sinnvoll nutzbar - an der Stelle 5 muss ja kein bereitgestellter Speicher liegen)


C++:
int *z;
*z = 5;


hier ist, wie du schon richtig festgestellt hast, z undefiniert (zeigt also auf irgendeine speicherstelle, idealerweise auf die Adresse 0, welche auch wieder ungültig ist)



C++:
int a;
int *z = &a;
*z = 5;



hier hast du eine definierte Speicherstelle für z - nämlich die Stelle an der a liegt.

Für was brauchst du denn den Pointer überhaupt?
--
class God : public ChuckNorris { };

Dieser Post wurde am 29.05.2022 um 13:42 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.05.2022, 19:40 Uhr
Data2006



Hi.

Danke schön.

Das mit den Pointern/Zeiger brauche ich aktuell nicht für ein Programm.
Ich probiere gerade verschiedenes mit C++ aus.
Wollte mal meine alten C-Kenntnisse auffrischen.

LG
Data2006
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.06.2022, 17:24 Uhr
ao

(Operator)



Zitat von FloSoft:


C++:
int *z=5;


hier weist du z die adresse 5 zu. Das ist etwas was ein aktueller compiler so nicht zulässt. (Direkte adressierung ist zu fehleranfällig und auch durch die Speichermodelle der Betriebsysteme so gar nicht sinnvoll nutzbar - an der Stelle 5 muss ja kein bereitgestellter Speicher liegen)

Das ist nicht der Grund.

Erstens ist es nicht Sache des Compilers, zu bewerten, wie fehleranfällig ein Ansatz ist. Der Compiler hat den größten Blödsinn klaglos zu übersetzen, wenn es syntaktisch richtig formulierter Blödsinn ist. Mit einem reinterpret_cast kriegt man das hier hin: int *z = reinterpret_cast<int*>(5);

Zweitens ist dem Compiler das Speichermodell des Betriebssystems ziemlich schnuppe - der weiß doch gar nicht, ob es überhaupt ein Betriebssystem mit Speichermodell gibt. Wenn das Programm bare-metal auf einem Mikrocontroller läuft, kann sowas wie "biege einen Int-Pointer auf die Adresse 5" ein sinnvoller Befehl sein.

Der Grund ist schlicht und einfach, dass int *z = 5; kein gültiges C++ ist, weil eine implizite Umwandlung von int zu int* illegal ist. In C wäre es legal.

Dieser Post wurde am 06.06.2022 um 17:27 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: