Wo der Stern in C- und C++-Zeigernotation eingefügt werden soll [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
Martin Kristiansen

Mögliches Duplikat:

Richtige Methode zum Deklarieren von Zeigervariablen in C/C++

Seit einiger Zeit nervt mich folgendes, wo ich den Stern in meiner Pointer-Notation setzen soll.

int *var; // 1

und

int* var; // 2

tun offensichtlich dasselbe, und beide Notationen sind korrekt, aber ich finde, dass die meiste Literatur und der Code, die ich mir ansehe, die 1. Notation verwenden.

Wäre es nicht “korrekter”, die 2. Notation zu verwenden und den Typ und den Variablennamen durch ein Leerzeichen zu trennen, anstatt den Typ und die Variablen-Token zu mischen?

  • Es wäre, wenn Sie die Dinge aus einem Typwinkel betrachten. Aber die Deklarationssyntax von C ist nicht so. int* p, q; deklariert einen Zeiger und eine Ebene int.

    – Daniel Fischer

    15. Dezember 2012 um 17:00 Uhr

  • Sie sind gleich, es ist eine persönliche Entscheidung, und diese Frage ist sowohl unbeantwortbar als auch ein hundertfaches Duplikat.

    – Karl Norum

    15. Dezember 2012 um 17:01 Uhr

  • @DanielFischer: Ich möchte dir die Punkte geben, also wenn ich zwei Zeiger deklarieren wollte, müsste ich setzen int *p, *q?

    – Martin Kristiansen

    15. Dezember 2012 um 17:03 Uhr


  • Ja, die Idee (ich mag es nicht) ist “Deklaration imitiert die Verwendung”. Sie brauchen also ein Sternchen für jeden Zeiger, den Sie deklarieren, und Klammern für jedes Array (außer wenn Sie typedefs verwenden, um die Notwendigkeit zu beseitigen).

    – Daniel Fischer

    15. Dezember 2012 um 17:05 Uhr


  • Sie betreten ein Thema religiösen Eifers. Ich stimme deiner Argumentation aber zu. Das Gegenbeispiel ist normalerweise so etwas wie “int* p, q”, wo ich sagen würde “Tu das dann einfach nicht”.

    – Frank Osterfeld

    15. Dezember 2012 um 17:07 Uhr


Nein niemals. <g>

Aber bedenke:

int* var1, var2;

Hier ist die Platzierung der * ist irreführend, weil es so ist nicht gelten var2das ist ein int und nicht ein int*.

  • Gilt das gleiche für & und const?

    – Martin Kristiansen

    15. Dezember 2012 um 17:05 Uhr

  • Ja für &Nein für const.

    – Peter Becker

    15. Dezember 2012 um 22:52 Uhr

  • Die Sprache, die ich lieben gelernt hatte, ist nicht die saubere Schönheit, die ich dachte.

    – Martin Kristiansen

    15. Dezember 2012 um 23:16 Uhr

  • @MartinKristiansen Das wird dir noch ein Dutzend Mal auffallen…

    – glglgl

    17. Dezember 2012 um 9:35 Uhr

  • Ich habe diese Frage vor langer Zeit gelesen und eine Weile darüber nachgedacht, aber ich bin zu diesem Schluss gekommen: Es MUSS “int * var” sein, nicht “int var” aufgrund dieses einfachen Beispiels: Wenn Sie unbenutzte Variablen auskommentieren, denken Sie darüber nach, wie Sie sie auskommentieren: Sie würden dies niemals tun: void somefunc(int / var */) {} richtig?? Sie müssen dies tun: void somefunc(int /* var */) {}… aufgrund dieser Analogie würden Sie in erster Linie die Funktionssignatur ändern, dies ist mein bestes Argument dafür, den Stern auf den Typ und nicht auf die Variable zu setzen. Ich wünschte nur, EINIGE LEUTE würden es tun Nimm einen Hinweis darauf (tritt QT)

    – Osirisgothra

    2. April 2014 um 15:08 Uhr


Benutzer-Avatar
0x90

Das Codierungsstil des Linux-Kernels Konvention ist:

int *ptr1 , *ptr2;

Ich denke also, Sie sollten es als Ihre Konvention annehmen.

Beim Deklarieren von Zeigerdaten oder einer Funktion, die einen Zeigertyp zurückgibt, ist die bevorzugte Verwendung von * steht neben dem Datennamen oder Funktionsnamen und nicht neben dem Typnamen. Beispiele:

char *linux_banner;
unsigned long long memparse(char *ptr, char **retptr);
char *match_strdup(substring_t *s);

Ich glaube, dass ein Teil des Grundes für diese Notation darin besteht, dass die Verwendung und Deklaration einer Variablen ähnlich aussehen.

int *var;
int x;
x = *var;

Man kann sich das auch so vorstellen, als würde man diese Dereferenzierung sagen var gibt dir einen int.

  • Ich denke, dass dies die richtige Begründung ist. * und & werden für Bezeichner in Anweisungen verwendet, die keine Definitionen oder Deklarationen sind. x = *var bedeutet, das dereferenzierte Ding zuzuweisen var zu xund ähnlich int *var bedeutet „das Ding, das var Dereferenzen auf ist vom Typ int“.

    – Gauthier

    2. März 2015 um 14:41 Uhr


  • Leider, als ich zum ersten Mal C lernte, hat mich diese Ähnlichkeit und Denkweise ausgeglichen mehr verwirrt über Zeiger. Erst als ich anfing, über Pointer nachzudenken Typen dass ich sie verstanden habe. Und natürlich gilt diese Begründung überhaupt nicht für Referenzen in C++.

    – jamesdlin

    25. Januar 2019 um 4:20 Uhr


  • ich dachte an int *p; als die *p ist vom Typ int. Es ist jedoch seltsam, wenn Sie sich darüber im Klaren sind, dass Sie initialisieren können p wie int foo=42; int *p = &foo; Hier int* p = &foo; macht für mich mehr Sinn.

    – Semnodime

    22. August 2019 um 3:53 Uhr

1382940cookie-checkWo der Stern in C- und C++-Zeigernotation eingefügt werden soll [duplicate]

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

Privacy policy