Zeiger deklarieren; Sternchen links oder rechts vom Leerzeichen zwischen Typ und Name? [duplicate]

Lesezeit: 9 Minuten

Benutzer-Avatar
jakogut

Mögliche Duplikate:

Was macht mehr Sinn – char* string oder char *string? Zeigerdeklarationen in C++: Platzierung des Sternchens

Ich habe gemischte Versionen davon in einer Menge Code gesehen. (Dies gilt übrigens für C und C++.) Die Leute scheinen Zeiger auf eine von zwei Arten zu deklarieren, und ich habe keine Ahnung, welche richtig ist, ob es überhaupt eine Rolle spielt.

Die erste Möglichkeit besteht darin, das Sternchen wie folgt neben den Typnamen zu setzen:

someType* somePtr;

Die zweite Möglichkeit besteht darin, das Sternchen wie folgt neben den Namen der Variablen zu setzen:

someType *somePtr;

Das treibt mich schon seit einiger Zeit in den Wahnsinn. Gibt es eine Standardmethode zum Deklarieren von Zeigern? Spielt es überhaupt eine Rolle, wie Zeiger deklariert werden? Ich habe beide Deklarationen zuvor verwendet und weiß, dass es dem Compiler egal ist, wie es ist. Die Tatsache, dass ich Zeiger gesehen habe, die auf zwei verschiedene Arten deklariert wurden, lässt mich jedoch glauben, dass es einen Grund dafür gibt. Ich bin gespannt, ob eine der beiden Methoden in irgendeiner Weise lesbarer oder logischer ist, die ich vermisse.

  • Schönheit ist innerlich, !äußerlich. Codeausführung verschönern.

    – Nein 1.1

    18. April 2010 um 0:49 Uhr


  • Schon ein paar mal gemacht. Siehe unter am wenigsten stackoverflow.com/questions/855566/… stackoverflow.com/questions/398395/… stackoverflow.com/questions/558474/…

    – dmckee — Ex-Moderator-Kätzchen

    18. April 2010 um 0:52 Uhr

  • Sicher, es ist kein einfaches Thema zu suchen …

    – dmckee — Ex-Moderator-Kätzchen

    18. April 2010 um 0:52 Uhr

  • N-tes Duplikat einer Reihe älterer Fragen, wie stackoverflow.com/questions/377164/…

    – Café

    18. April 2010 um 0:54 Uhr


  • @GenTiradentes Ärgern Sie sich nicht, ein Duplikat zu fragen, ob es in gutem Glauben gemacht wurde. Wir schließen sie, um zu versuchen, die Antworten an einem Ort gesammelt zu halten, nicht als eine Art Bestrafung.

    – dmckee — Ex-Moderator-Kätzchen

    18. April 2010 um 2:03 Uhr

Benutzer-Avatar
Tyler McHenry

Es ist eine Frage der Präferenz und so etwas wie ein heiliger Krieg, genau wie der Stil der Zahnspange.

Der “C++”-Stil

someType* somePtr;

betont den Typ der Zeigervariablen. Es sagt im Wesentlichen “die Art von somePtr ist Zeiger-auf-someType“.

Der “C”-Stil

someType *somePtr;

betont den Typ der Daten, auf die gezeigt wird. Es sagt im Wesentlichen “die Art der Daten, auf die von verwiesen wird somePtr ist someType“.

Beide bedeuten dasselbe, aber es hängt davon ab, ob das mentale Modell eines bestimmten Programmierers beim Erstellen eines Zeigers sozusagen auf die Daten, auf die gezeigt wird, oder die Zeigervariable “fokussiert” ist.

Setzen Sie es in die Mitte (wie someType * somePtr) versucht zu vermeiden, sich auf eines der beiden festzulegen.

  • Ich habe ein Leerzeichen um die gesetzt *, aber es geht nicht darum, das Begehen zu vermeiden. Meine Betonung liegt definitiv auf Typen, aber ich sehe es als Modifikator eines Typs. Ähnlich wie wir es nicht sagen intconst sondern int const. Die Version mit “Leerzeichen rundherum” scheint auch besser zu lesen, wenn Sie dies getan haben const im Spiel. int const * const p; vs int const* const q; (oder vielleicht die minimalen Räume, die die Leute bevorzugen würden int const*const r;?)

    – David Stein

    19. Oktober 2013 um 2:53 Uhr


  • Ich kann verstehen, dass Sie den Raum auf beiden Seiten mit Ihrer Begründung platzieren, aber ich würde es trotzdem vermeiden. Lässt das Ganze für mich zu sehr nach Multiplikation aussehen.

    – Edwin Buck

    17. Oktober 2014 um 15:04 Uhr

  • Neben der Variablendeklaration gilt die gleiche Debatte auch für Typedefs darüber, ob der Zeiger logisch zum Typ oder zu dem zu definierenden Ding gehört … (a) typedef Cat *CatPointer; (b) typedef Cat* CatPointer; Beim Schreiben einer Typedef in der anderen Reihenfolge über “using” wird jedoch klarer, zu welchem ​​​​Wort das Sternchen in einer Typedef gehört, da das erste funktioniert und das zweite nicht kompilierbarer Unsinn ist. (a) using CatPointer = Cat*; (b) using *CatPointer = Cat;

    – Dwayne Robinson

    18. Dezember 2015 um 4:26 Uhr


  • Ich bevorzuge someType*und verwenden Sie es immer beim Deklarieren von Parametern. Jedoch Es gibt ein gutes logisches Argument gegen diesen Stil beim Deklarieren von Feldern. Denn für jemanden, der nicht an C++ gewöhnt ist, ist die Deklaration someType* value1, value2; wird mit ziemlicher Sicherheit als beides interpretiert value1 und value2 Zeiger sein. (Nur value1 ist ein Zeiger.) Kurz gesagt, das Sternchen ist kein Modifikator des Typbezeichners selbst, sondern muss angewendet werden jeder Variable, also gehört es auf die Variable. Leider finde ich immer noch someType* viel einfacher zu lesen. 🙁

    – AnorZaken

    29. Juli 2016 um 16:55 Uhr


  • the type of data pointed to by somePtr is someType -> Wie würden Sie lesen someType * const somePtr dann? Bemerken, dass const ist ein Modifikator für *, nicht die Variable. Sie können nicht sagen “der Datentyp, auf den eine konstante Variable somePtr zeigt, ist someType”. Da geht Ihre Zweideutigkeit. “Der Typ von somePtr ist ein konstanter Zeiger auf irgendeinen Typ” ist der einzige konsistente. Zu sagen, dass “der Datentyp, auf den die Variable somePtr ständig zeigt, irgendein Typ ist”, ist auch schon ein wenig falsch. Es geht nicht mehr darum, den Parameter als konstant zu deklarieren.

    – Konsolebox

    12. August 2016 um 21:56 Uhr

Benutzer-Avatar
Johannes Schaub – litb

Es spielt keine Rolle. Jemand wird jetzt daherkommen und die Frage als Dupe abschließen, und ein anderer wird zeigen, wie das geht int* a weg bricht, wenn Sie mehrere Variablen in den gleichen Deklarationen während deklarieren int *a spiegelt die syntaktische Struktur des Codes besser wider, und eine andere wird zeigen, dass Stroustrup die bevorzugt int* a Weise und hält die Schrift auf der linken Seite zusammen.

Viele Meinungen, aber kein “richtiger” Weg hier.

  • Ich bin mir nicht sicher, aber gibt es keinen pragmatischen Grund dafür, wie die Sprachgrammatik das Parsen des Sternchens erstellt? Wenn ich an die Deklaration des Funktionszeigers denke (rt (*f) ()) und Deklaration mehrerer Variablen (t *a, *b), bin ich geneigt zu glauben, dass das Sternchen den Bezeichner an seinem qualifiziert Rechtsähnlich wie const qualifiziert tatsächlich den Bezeichner links davon (außer wenn er an erster Stelle in der Anweisung steht).

    – v.oddou

    25. Februar 2016 um 8:46 Uhr


  • @v.odd dieses Argument habe ich zusammengefasst als “the int *a way better spiegelt die syntaktische Struktur wider” 🙂 Der Zweck des Schreibens von gutem Code besteht jedoch nicht darin, die im Standard verwendete Grammatik irgendwie zu imitieren. In erster Linie sollte Code funktionieren und wartbar sein, darüber kann man streiten.

    – Johannes Schaub – litb

    25. Februar 2016 um 9:52 Uhr

  • einverstanden. aber es hilft, die Regeln zu kennen, um sich daran zu erinnern, wie man etwas schreibt, wenn es ein bisschen gekünstelt wird. Auch gibt es die Sternchenschule in der Mitte type * var Leute, die behaupten, es sei sinnvoll, weil const auch nicht an Bezeichner gebunden ist. type const*const v; oder type const* const v; oder type const *const v; Sie wählen: type const * const v; Leerzeichen überall, dadurch keine Vorzugsbehandlung.

    – v.oddou

    26. Februar 2016 um 1:56 Uhr

  • @v.oddou Das Sternchen ist kein Qualifizierer wie const. Der Qualifizierer gehört zum Typbezeichner (es geht übrigens nicht um die Syntax, sondern um die Grammatik), während der * ist Teil des Deklarators. Auch Schreiben int *p; ähnelt der späteren Verwendung. Oder schreibt jemand * p? Last not least: Es gibt Codierungsstandards, die das durchsetzen int *p Variante, aber ich habe noch keine gesehen, die eine der anderen erfordert. Und der Streit um int* p, q; Einen falschen visuellen Eindruck zu erwecken ist imo ziemlich stark. Also, wenn man schreibt int *p, q;warum schreiben int* p;? Sei konsequent!

    – zu ehrlich für diese Seite

    10. Januar 2017 um 2:26 Uhr


  • Davon war ich überzeugt int *a war besser als int* a aber dann habe ich eine funktion mit int* restrict a sondern int restrict *a funktioniert nicht.

    – Z-Boson

    23. März 2017 um 11:44 Uhr

Es spielt keine Rolle, es ist eine persönliche Präferenz.

Manche Leute mögen es, den Typ zusammenzuhalten:

int* p;

Andere Leute sagen, dass es aus folgendem Grund neben der Variablen stehen sollte:

int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.

Mit der Zeit wird man das einfach übersehen und beide Varianten akzeptieren.

  • Ja, das war der Fall, der mir bei der Auswahl geholfen hat int *p zu Ende int* p. Für mich bedeutet dies, dass das Sternchen eine Beziehung zum Bezeichner hat.

    – Shamel Lee

    11. November 2017 um 19:53 Uhr


Benutzer-Avatar
Lanze Diduck

Der Unterschied entstand, weil C++ ein stärkeres hinzufügte Typ System oben auf C.


C-Stil

AC-Programmierer denken also normalerweise in Begriffen von “Werten”.

int  *pValue;

lautet „die Dereferenzierung von pValue ist ein int“.

C++-Stil

Wohingegen ein C++-Programmierer so in “Typen” denkt

int* pValue;

lautet „die Typ von pValue ist Zeiger auf int“.


Der Compiler sieht natürlich überhaupt keinen Unterschied. Sie werden jedoch feststellen, dass es die C-Programmierer sind, die beim Programmieren in C++ auf “Werte-Semantik” bestehen.

Ich denke, es ist klarer, das Sternchen neben den Namen der Variablen zu setzen.

Sie könnten fälschlicherweise deklarieren someType* one, two; denken, dass sie beide Zeiger sind, aber nur die Variable one ist ein Zeiger; two ist nur ein someType. Deklarieren als someType *one, *two vermeidet dieses Problem.

  • Ok, aber das erste Mal, wenn Sie tippen two->doSomething() Sie werden sofort den Fehler sehen, den Sie in jeder modernen IDE gemacht haben, also ist das wirklich keine große Sache.

    –Andreas

    20. Oktober 2017 um 6:25 Uhr

  • @mrt Ihr Argument gilt nur, wenn der Typ Mitglieder hat; Wenn der Typ ein Skalar ist, wie z int oder schweben, es gibt keine Mitglieder zum Anrufen.

    – Shamel Lee

    11. November 2017 um 20:00 Uhr

  • @ShammelLee Ja, da hast du einen Punkt! Ich habe nicht an einfache Typen gedacht, als ich diesen Kommentar abgegeben habe.

    –Andreas

    13. November 2017 um 5:32 Uhr

Benutzer-Avatar
RivieraKid

Jeder einzelne Weg, den ich je gesehen habe, ist

TheType *myPointer

weil Sie einen POINTER vom Typ TheType deklarieren. Ähnliche Deklaration

TheType myVar

würde eine Instanzvariable vom Typ TheType deklarieren.

Auch können Sie dies dann übersichtlich tun und haben es leicht lesbar

TheType myVar, *myPointer;

  • Ok, aber das erste Mal, wenn Sie tippen two->doSomething() Sie werden sofort den Fehler sehen, den Sie in jeder modernen IDE gemacht haben, also ist das wirklich keine große Sache.

    –Andreas

    20. Oktober 2017 um 6:25 Uhr

  • @mrt Ihr Argument gilt nur, wenn der Typ Mitglieder hat; Wenn der Typ ein Skalar ist, wie z int oder schweben, es gibt keine Mitglieder zum Anrufen.

    – Shamel Lee

    11. November 2017 um 20:00 Uhr

  • @ShammelLee Ja, da hast du einen Punkt! Ich habe nicht an einfache Typen gedacht, als ich diesen Kommentar abgegeben habe.

    –Andreas

    13. November 2017 um 5:32 Uhr

1013500cookie-checkZeiger deklarieren; Sternchen links oder rechts vom Leerzeichen zwischen Typ und Name? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy