Wo der Stern in C- und C++-Zeigernotation eingefügt werden soll [duplicate]
Lesezeit: 4 Minuten
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)
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
13829400cookie-checkWo der Stern in C- und C++-Zeigernotation eingefügt werden soll [duplicate]yes
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 Ebeneint
.– 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