Anfängerfragen zu *, ->, .



  • Hallo,
    ich habe ein paar Fragen zum allgemeinen Syntax.

    Mir begegnen immer mal wieder *, die ich so weit auch als Zeiger-Symbole identifiziere. Jetzt kommt es aber vor, dass die * mal direkt nach dem Datentyp, direkt vor dem Zeiger(int *intZeiger = 0; ) oder irgendwie dazwischen (D3DDISPLAYMODE * DisplayMode; ) stehen. Gibt es da irgendwelche Unterschiede?

    Fast die gleiche Frage betrifft die Verwendung von "." und "->". Wann benutzt man welchen Ausdruck? Und gibt es evtl einen Shortcut für "->"?

    Und, falls es leicht zu beantworten ist: Was bedeuten __ vor Variablen? Was sagt mir der grüne Rand an der linken Seite in VS?

    MfG
    Dr. Bernd



  • Hallo,

    also der * steht für einen Zeiger. Wo der Stern bei den drei Möglichkeiten steht ist egal.

    Mit -> bzw. . greifst du auf Klassenmember zu. Der Unterschied ist, dass du den Punkt bei einem Objekt verwendest und ->, wenn du einen Zeiger auf ein Objekt benutzt.

    Der grüne bzw. gelbe Rand zeigt dir die Änderungen seit dem letzten Speichern (gelb) bzw. seit öffnen des Dokuments (grün)



  • Dr. Bernd schrieb:

    Hallo,
    ich habe ein paar Fragen zum allgemeinen Syntax.

    Mir begegnen immer mal wieder *, die ich so weit auch als Zeiger-Symbole identifiziere. Jetzt kommt es aber vor, dass die * mal direkt nach dem Datentyp, direkt vor dem Zeiger(int *intZeiger = 0; ) oder irgendwie dazwischen (D3DDISPLAYMODE * DisplayMode; ) stehen. Gibt es da irgendwelche Unterschiede?

    nein 🙂

    Dr. Bernd schrieb:

    Fast die gleiche Frage betrifft die Verwendung von "." und "->". Wann benutzt man welchen Ausdruck? Und gibt es evtl einen Shortcut für "->"?

    mit einem . greifst du auf einen member einer klasse oder struktur zu. mit einem -> dereferenzierst du zu erst einen zeiger auf eine klasse oder struktur und greifst dann auf den member zu. es ist also das gleiche wie *class.member

    Dr. Bernd schrieb:

    Und, falls es leicht zu beantworten ist: Was bedeuten __ vor Variablen? Was sagt mir der grüne Rand an der linken Seite in VS?

    MfG
    Dr. Bernd

    da bin ich mir nicht sicher ob der compiler von vs das speziell interpretiert, aber meistens verwendet man unterstriche zur indikation von intern benutzten variablen oder funktionen.



  • Dr. Bernd schrieb:

    Mir begegnen immer mal wieder *, die ich so weit auch als Zeiger-Symbole identifiziere. Jetzt kommt es aber vor, dass die * mal direkt nach dem Datentyp, direkt vor dem Zeiger(int *intZeiger = 0; ) oder irgendwie dazwischen (D3DDISPLAYMODE * DisplayMode; ) stehen. Gibt es da irgendwelche Unterschiede?

    Nene, alles das Gleiche:

    int* p1;
    int *p2;
    int * p3;
    

    Nur muss man aufpassen, wenn man mehrere Zeiger hintereinander deklariert:

    int* p1, p2, p3; // Deklariert p1 als "Zeiger auf int", p2 und p3 nur als "int"
    int *p1, *p2, *p3; // Deklariert alle drei als "Zeiger auf int"
    

    Dr. Bernd schrieb:

    Fast die gleiche Frage betrifft die Verwendung von "." und "->". Wann benutzt man welchen Ausdruck? Und gibt es evtl einen Shortcut für "->"?

    Bei Zeigern nimmst du "->", ansonsten ".", einen Shortcut für "->" gibt's nicht, eigentlich ist "->" sogar ein Shortcut für "(*obj).bla()".

    struct Pferd
    {
        int hufe;
    };
    
    Pferd pferd;
    pferd.hufe = 4;
    
    Pferd* p = &pferd; // Zeiger auf Variable "pferd"
    p->hufe = 3;
    
    Pferd& r = pferd; // Referenz auf Variable "pferd"
    r.hufe = 2;
    

    Btw, eine Referenz ist fast das gleiche wie ein Zeiger, verweist also auch nur auf eine andere Instanz.

    Dr. Bernd schrieb:

    Und, falls es leicht zu beantworten ist: Was bedeuten __ vor Variablen?

    Alles mit "__" vorne ist Compiler-spezifisch. "__FILE__" ist z.B. ein Compiler-Makro, dass an die Stelle von "__FILE__" den aktuellen Dateinamen setzt.

    Dr. Bernd schrieb:

    Was sagt mir der grüne Rand an der linken Seite in VS?

    Hm, hab keinen grünen Rand 😕

    ach herrje, wieder mal so langsam...



  • Wow! Vielen Dank für die unglaublich schnellen Antworten! 🙂 Haben sehr geholfen.



  • Also die Unterstriche KÖNNTEST du auch benutzen, SOLLTEST du aber nicht. Weil du sonst unter Umständen irgendwas dem Compiler mitteilst, was du gar nicht beabsichtigst.

    Der gelbe Rand zeigt dir im Code, was du verändert hast und wenn du das speicherst, wird er gründ. Somit siehst du immer, welche Stellen im Code du verändert hast und welche bereits gespeichert sind.



  • sothis_ schrieb:

    mit einem . greifst du auf einen member einer klasse oder struktur zu. mit einem -> dereferenzierst du zu erst einen zeiger auf eine klasse oder struktur und greifst dann auf den member zu. es ist also das gleiche wie *class.member

    Kleine Anmerkung: *className.foo ist NICHT das gleiche wie className->foo, da der Punktoperator stärker bindet und es somit der Derefernzierung des Zeigers foo des Objekts className enspricht. Richtig wäre also: className->foo ist semantisch äquivalent zu (*className).foo.



  • this->that schrieb:

    sothis_ schrieb:

    mit einem . greifst du auf einen member einer klasse oder struktur zu. mit einem -> dereferenzierst du zu erst einen zeiger auf eine klasse oder struktur und greifst dann auf den member zu. es ist also das gleiche wie *class.member

    Kleine Anmerkung: *className.foo ist NICHT das gleiche wie className->foo, da der Punktoperator stärker bindet und es somit der Derefernzierung des Zeigers foo des Objekts className enspricht. Richtig wäre also: className->foo ist semantisch äquivalent zu *(className).foo.

    Muss auch nicht sein. Der -> Operator kann überladen werden und der . Operator nicht. Könnte also etwas völlig anderes bedeuten.



  • drakon schrieb:

    this->that schrieb:

    sothis_ schrieb:

    mit einem . greifst du auf einen member einer klasse oder struktur zu. mit einem -> dereferenzierst du zu erst einen zeiger auf eine klasse oder struktur und greifst dann auf den member zu. es ist also das gleiche wie *class.member

    Kleine Anmerkung: *className.foo ist NICHT das gleiche wie className->foo, da der Punktoperator stärker bindet und es somit der Derefernzierung des Zeigers foo des Objekts className enspricht. Richtig wäre also: className->foo ist semantisch äquivalent zu *(className).foo.

    Muss auch nicht sein. Der -> Operator kann überladen werden und der . Operator nicht. Könnte also etwas völlig anderes bedeuten.

    In dem Kontext dieses Threads gings nur um Zeiger und nicht um Operatorüberladung. Insofern bin ich das mal einfach übergangen.


Anmelden zum Antworten