Urmel: C++ Pointer

Hi zusammen, ich habe eine Frage bzgl. C++ Pointer. Da ich noch ein blutiger Anfänger bin wird sich diese Frage sehr wahrscheinlich auch schnell beantworten lassen.

ich verstehe den unterschied nicht von einem Initialisierenden Pointer.
Bei dem die Syntax folgendmaßen ausschaut.

int a,*pointer=&a;

bekomme ich keinen Compilerfehler.
Schreibe ich allerdings
nicht bei der Initalisierung sondern nach der Initalisierung
den wert in pointer um z.B.

*pointer = &a;

so erhalte ich einen compilerfehler, dass ist auch plausibel, da hierbei *pointer ein dereferenzierter Zeiger ist  und &a nunmal ein Zeiger. So muss ich explizit den Zeiger &a dereferenzieren bzw. konvertieren indem ich
*pointer = *(&a);
angebe. Das klingt für mich auch logisch. allerdings bleibt für mich jetzt immer noch die Frage offen, WESSHALB klappt diese Zuweisung
int a,*pointer=&a;
bei der Initialisierung ???

Vielleicht habe ich auch alles falsch verstanden dann wäre ich froh wenn mir jemand erklären könnte wo mein logischer Verstand zu hapern anfängt.

  1. Hi !

    Irgendwie falsches Forum , aber mal sehen.

    1. int a,*pointer=&a;

    Ok, eine Variable a vom Typ int, ein Zeiger pointer, der auf a verweist.

    1. *pointer = &a;

    Du versuchst die Adresse von a in die Variable, auf die der Pointer zeigt zu schreiben. Kann nicht gehen, da a vom Typ int ist.

    1. *pointer = *(&a);

    Komplizierter als a = a, macht aber genau das gleiche (insofern pointer auf a verweist).

    1. pointer = &a;

    Ist wohl das, wonach Du suchst. Speichere die Adresse von a in pointer. Danach ist es egal, ob Du mit

    1. a = 5;
      oder
    2. *pointer =5;

    arbeitest.

    CU,

    Dwaddy

    1. Also erstmal Danke, für deine Antwort. Aber das war mir auch schon klar ;)
      mir ging es halt darum zu wissen wesshalb bei der Initialisierung des Pointers die Angabe
      int *pointer = &a;
      funktioniert was eingentlich doch unlogisch ist. Denn was er doch hier versucht ist einen Zeiger einem Integer zuzuordnen. Sehe ich das falsch??

      Desshalb bekomme ich ja auch einen Compilerfehler wenn ich nach der Initialisierung ,von *pointer, an *pointer einen neuen wert zuweise, welcher dann folgendermaßen ausschaut

      *pointer = a&;

      Das habe ich auch alles verstanden mir gings es halt nur darum warum es bei der Initialisierung s.o. ablaufen kann. Obwohl das doch eingentlich unlogisch ist?!

      Gruß Urmel

      Ps. Wahrscheinlich habe ich es doch nicht verstanden;), oder ??

      1. Joho,

        Also erstmal Danke, für deine Antwort. Aber das war mir auch schon klar ;)

        Sah im Posting nicht so aus...

        mir ging es halt darum zu wissen wesshalb bei der Initialisierung des Pointers die Angabe
        int *pointer = &a;
        funktioniert was eingentlich doch unlogisch ist. Denn was er doch hier versucht ist
        einen Zeiger einem Integer zuzuordnen. Sehe ich das falsch??

        Ja, siehst du. Bei der Variablen-Deklaration ist das * kein Dereferenzierungs-Operator,
        sondern zeigt dem Compiler lediglich, dass die Variable ein Pointer des angegebenen Typs sein
        soll. So waere

        int a = 10,
            *pointer = &a;

        dasselbe wie

        int a = 10,
            *pointer = NULL;

        pointer = &a;

        Das habe ich auch alles verstanden mir gings es halt nur darum warum es bei der
        Initialisierung s.o. ablaufen kann. Obwohl das doch eingentlich unlogisch ist?!

        Nein, ist es nicht.

        Gruss,
         CK

        1. Das habe ich auch alles verstanden mir gings es halt nur darum warum es bei der
          Initialisierung s.o. ablaufen kann. Obwohl das doch eingentlich unlogisch ist?!
          Nein, ist es nicht.

          Du hast recht ;) entschuldige wenn ich ein wenig überheblich tat. Nun ist mir ein Licht aufgegangen und ich habe es vollkommen verstanden, aber diesmal wirklich !!!
          Nun ich dachte immer ... ist ja jetzt auch egal, da ich es jetzt zu 100% prozent vertanden habe.
          ist mir zu peinlich meinen falschen Gedanken in Worte zu fassen ;)

          RIESEN DANKESCHÖN AN ALLE DIE MIR DABEI GEHOLFEN HABEN.
          Gruß Urmel

          1. Moin auch!

            Du hast recht ;) entschuldige wenn ich ein wenig überheblich tat. Nun ist mir ein Licht aufgegangen und ich habe es vollkommen verstanden, aber diesmal wirklich !!!

            Ja? Ok, Kontrollfrage: Wenn ich zwei Pointer auf int namens a und b deklariere, warum schreibe ich
              int *a, *b;
            und nicht
              int* a, b;
            ?

            So long

            1. Joho,

              Ja? Ok, Kontrollfrage: Wenn ich zwei Pointer auf int namens a und b deklariere, warum
              schreibe ich
                int *a, *b;
              und nicht
                int* a, b;
              ?

              Was ist denn das fuer eine Frage?!

              mit
              int* a,b;

              definierst du einen int-Pointer und eine int-Variable, und mit

              int *a, *b;
              zwei int-Pointer.

              Gruss,
               CK

              1. Moin!

                Was ist denn das fuer eine Frage?!
                mit
                int* a,b;
                definierst du einen int-Pointer und eine int-Variable, und mit
                int *a, *b;
                zwei int-Pointer.

                Schon richtig. Die eigentliche Frage war, warum muss ich vor jeden Variablennamen einen * schreiben und nicht nur einen * nach dem int? Schliesslich gibt man doch bei der Deklaration zuerst den Variablentyp und dann den Variablennamen oder mehrere durch Komma getrennte Namen an. Oder doch nicht? (<-- nicht-rhetorische Frage) Wenn ja, dann muesste es int* a, b heissen, denn int* heisst "Pointer auf int" und a, b ist die Auflistung der neuen Namen.

                So long

                1. Joho,

                  Schon richtig. Die eigentliche Frage war, warum muss ich vor jeden Variablennamen einen
                  * schreiben und nicht nur einen * nach dem int? Schliesslich gibt man doch bei der
                  Deklaration zuerst den Variablentyp und dann den Variablennamen oder mehrere durch Komma
                  getrennte Namen an. Oder doch nicht? (<-- nicht-rhetorische Frage) Wenn ja, dann muesste
                  es int* a, b heissen, denn int* heisst "Pointer auf int" und a, b ist die Auflistung der
                  neuen Namen.

                  Hm. Interessante Frage. Vielleicht, weil ein Pointer kein Datentyp ist?

                  Ansonsten wuerde ich darauf tippen, dass es sich einfach so eingebuergert hat und jetzt
                  in den C/C++-Specs drin steht.

                  Gruss,
                   CK
                   http://wwwtech.de

                  1. Hi again!

                    Na, ich hatte ja gehofft, es meldet sich noch jemand, der es weiss, aber da das wohl nicht der Fall ist, muss ich eben mal meine humble Vermutung kund tun.

                    Wenn man eine Variablendeklaration
                      int a;
                    in der Weise "Ein int kommt raus, wenn ich a hinschreibe" liest, dann uebersetzt sich
                      int * a;
                    als "Ein int kommt raus, wenn ich *a hinschreibe, also a dereferenziere", und dann muss a ein Pointer auf int sein. Dann ergibt sich leicht
                      int *a, *b;
                    als Deklaration zweier int-Pointer ("int kommt raus, wenn ich *a oder *b hinschreibe"). Diese etwas schraege Leseweise hat den Vorteil, auch die Syntax fuer Funktionspointer halbwegs nachvollziehbar zu machen:
                      void (*pfv)(int);
                    "void kommt raus, wenn ich pfv dreferenziere und das dann mit einem int-Parameter aufrufe"
                    pfv ist also ein Funktionspointer auf eine Funktion, die einen int nimmt und nichts zurueckliefert. (Klammern um *pfv sind notwendig, weil die () dahinter Vorrang vorm * haben.)

                    Allerdings ergibt sich dann die Frage, warum bei einem Typecast z.B.
                      int * a = (int *) malloc(irgendwas);
                    (int *) quasi als ein Typsymbol behandelt wird.

                    Ansonsten wuerde ich darauf tippen, dass es sich einfach so eingebuergert hat und jetzt
                    in den C/C++-Specs drin steht.

                    Naja, K&R werden sich schon irgendwas dabei gedacht haben, auch wenn man manchmal behauptet, ihre Sprache sei urspruenglich ein Aprilscherz gewesen.

                    So long