Probleme mit Ausgabe von Pointer auf Adresse



  • Ich bin gerade dabei, mich an den Pointern zu versuchen.
    Um mir die Funktionsweise zu verdeutlcihen habe ich ein kleines Prog geschrieben (siehe Quelltext unten).
    Es funktioniert soweit, nur bei der Ausgabe vom Pointer, der auf eine Adresse zeigt, haperts.
    Es kommt folgende Fehlermeldung:

    error C2440: '=': 'int *__w64 ' kann nicht in 'int' konvertiert werden
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Was bitte ist eni reinterpret_cast-Operator und warum funzt es so net? Ich habe probiert mir die Adresse als String ausgeben zu lassen, aber auch das hat net gefunzt.

    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    int main(int argc, char* argv[]) {
    
    	int a = 1;
    	int *p = new int;	
    
    	cout << "Variable a: \t\t" << a;
    	cout << "\n\nAdresse a: \t\t" << &a;
    	cout << "\n\nPointer *p: \t\t" << *p;
    	*p = a;
    	cout << "\n\nPointer auf a: \t" << *p;
    	*p = &a;
    	cout << "\n\nPointer auf Adresse von a: \t" << *p;   //Adresse als String-Ausgabe habe ich so probiert: 
                                                            //<< string *p; hat aber net gefunzt;
    
    	getch();
    
    	return 0;
    }
    


  • sarah1986 schrieb:

    *p = a;
    	cout << "\n\nPointer auf a: \t" << *p;
    

    "Pointer auf a" würde in meinen ohren was anderes heißen. was du getan hast: du hast den wert von a in den mit new erzeugten int gelegt, auf den p zeigt. a und *p sind unabhängig voneinander.

    *p = a; //sagen wir, a = 4
    *p = 5; //a ist aber immer noch 4
    

    sarah1986 schrieb:

    *p = &a;
    

    ich bin mir nicht sicher, was du tun willst. willst du p auf a zeigen lassen? dann

    p = &a; //jetzt wirken *p und a auf denselben integer
    *p = 5; //ist gleichbedeutend mit a = 5
    //der mit new angelegte int ist übrigens jetzt nicht mehr zugreifbar, ein speicherleck. schlecht.
    


  • @sarah1986: Vllt. hilft dir folgendes Listing:

    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char **argv) {
      int i = 5, j;
      int *p = &i;    //mit Operator & Adresse von i holen und an p zuweisen
      j = *p;  //Derefenziere p mit Operator * und weise Ergebnis j zu
      cout<<j<<'\n';  //Gibt 5 aus
    
      p = &j;  //p zeigt jetzt auf j
      *p = 215;  //p dereferenzieren und 215 zuweisen
      cout<<j<<'\n';  //Gibt 215 aus
      return 0;
    };
    


  • GPC schrieb:

    int main(int argc, char **argv) {
    int i = 5, j;
    int *p = &i; //mit Operator & Adresse von i holen und an p zuweisen
    j = *p; //Derefenziere p mit Operator * und weise Ergebnis j zu
    cout<<j<<'\n'; //Gibt 5 aus

    Warum kommt hier 5 raus? Wenn ich den Pointer die Adresse von i zuweise, muesste er doch die Adresse ausgeben, oder nicht?

    GPC schrieb:

    p = &j; //p zeigt jetzt auf j

    zeigt der p in dem Fall nicht auf die Adresse von j?

    Ich versteh das irgendwie net, was mache ich, indem ich den ZEIGER dereferenziere (also das * davor schreibe)? Was passiert in dem Moment mit dem p?



  • sarah1986 schrieb:

    GPC schrieb:

    int main(int argc, char **argv) {
    int i = 5, j;
    int *p = &i; //mit Operator & Adresse von i holen und an p zuweisen
    j = *p; //Derefenziere p mit Operator * und weise Ergebnis j zu
    cout<<j<<'\n'; //Gibt 5 aus

    Warum kommt hier 5 raus? Wenn ich den Pointer die Adresse von i zuweise, muesste er doch die Adresse ausgeben, oder nicht?

    p wird die adresse von i zugewisen (zeigt auf die adresse), und j wird (durch das dereferenzieren) der inhalt dieser adrese (wert 5 ) zugewiesen



  • ich glaube, so ganz langsam verstehe ich es... Vielen Dank!



  • p=&i;
    

    Das bedeutet, daß p anschließend die Adresse enthält - d.h. er "zeigt" auf den Speicherplatz, wo i abgelegt wurde.

    j=*p;
    

    Die Anweisung dereferenziert den Pointer p (gibt also den Wert zurück, auf den p zeigt) und weist den erhaltenen Wert der Variablen j zu.



  • Das heißt jetzt also, immer wenn ich ein * vor den Pointer schreibe, gebe ich den Inhalt aus, ohne Stern die Adresse?
    Und bei Variablen den Inhalt mit dem Namen der Variable und mit einem & davor, die Adresse der Variablen?
    Hab ich das jetzt richtig verstanden?



  • sarah1986 schrieb:

    Das heißt jetzt also, immer wenn ich ein * vor den Pointer schreibe, gebe ich den Inhalt aus, ohne Stern die Adresse?
    Und bei Variablen den Inhalt mit dem Namen der Variable und mit einem & davor, die Adresse der Variablen?
    Hab ich das jetzt richtig verstanden?

    Ja. Stimmt so. Im Übrigen gibt's auch nen Artikel von mir zum Thema Pointer. Findest du im Artikel Sub-Forum.


Anmelden zum Antworten