it-swarm.com.de

Platzierung des Sterns in Zeigerdeklarationen

Ich habe vor kurzem entschieden, dass ich endlich C/C++ lernen muss, und es gibt eine Sache, die ich über Zeiger oder deren Definition nicht wirklich verstehe.

Wie wäre es mit diesen Beispielen:

  1. int* test;
  2. int *test;
  3. int * test;
  4. int* test,test2;
  5. int *test,test2;
  6. int * test,test2;

Nach meinem Verständnis machen die ersten drei Fälle alle dasselbe: Test ist kein int, sondern ein Zeiger auf einen.

Der zweite Satz von Beispielen ist etwas schwieriger. Im Fall 4 sind sowohl test als auch test2 Zeiger auf ein int, während im Fall 5 nur test ein Zeiger ist, während test2 ein "reelles" int ist. Was ist mit Fall 6? Gleich wie bei Fall 5?

71
Michael Stum

4, 5 und 6 sind dasselbe, nur test ist ein Zeiger. Wenn Sie zwei Zeiger benötigen, sollten Sie Folgendes verwenden:

int *test, *test2;

Oder noch besser (um alles klar zu machen):

int* test;
int* test2;
116
Milan Babuškov

Leerzeichen um Sternchen haben keine Bedeutung. Alle drei bedeuten dasselbe:

int* test;
int *test;
int * test;

Der "int *var1, var2" ist eine üble Syntax, die nur die Leute verwirren soll und sollte vermieden werden. Es erweitert sich zu:

int *var1;
int var2;
41
Ates Goral

Verwenden Sie die "Clockwise Spiral Rule" , um C/C++ - Deklarationen zu analysieren. 

Es gibt drei einfache Schritte, die zu befolgen sind:

  1. Beginnen Sie mit dem unbekannten Element und bewegen Sie sich spiralförmig im Uhrzeigersinn Richtung; Wenn Sie die folgenden Elemente treffen, ersetzen Sie sie durch die entsprechenden englischen Aussagen: 

    [X] oder []: Array X-Größe von ... oder Array undefinierte Größe von ... 

    (type1, type2): Funktion gibt type1 und type2 zurück und gibt ...

    *: Zeiger auf ...

  2. Machen Sie dies in einer Spirale/im Uhrzeigersinn, bis alle Marken bedeckt sind. 
  3. Löse immer etwas zuerst in Klammern!

Deklarationen sollten, wenn möglich, auch in separaten Anweisungen enthalten sein (was meistens der Fall ist).

32
Michael Burr

In vielen Codierungsrichtlinien wird empfohlen, nur eine Variable pro Zeile anzugeben. Dies vermeidet jede Verwirrung der Art, die Sie vor dem Stellen dieser Frage hatten. Die meisten C++ - Programmierer, mit denen ich gearbeitet habe, scheinen sich daran zu halten.


Ein bisschen nebenbei weiß ich, aber etwas, das ich für nützlich hielt, ist das Rückwärtslesen von Deklarationen.

int* test;   // test is a pointer to an int

Dies funktioniert sehr gut, besonders wenn Sie anfangen, const-Zeiger zu deklarieren, und es wird schwierig zu wissen, ob es sich bei dem Zeiger um const handelt oder ob der Zeiger darauf zeigt, dass const ist.

int* const test; // test is a const pointer to an int

int const * test; // test is a pointer to a const int ... but many people write this as  
const int * test; // test is a pointer to an int that's const
29
Scott Langham
#include <type_traits>

std::add_pointer<int>::type test, test2;
11
fredoverflow

Wie bereits erwähnt, sind 4, 5 und 6 gleich. Häufig verwenden Leute diese Beispiele, um das Argument zu machen, dass der * zu der Variablen gehört, anstatt zu dem Typ. Obwohl es eine Frage des Stils ist, gibt es einige Diskussionen darüber, ob Sie darüber nachdenken und es so schreiben sollten:

int* x; // "x is a pointer to int"

oder so:

int *x; // "*x is an int"

FWIW Ich bin im ersten Lager, aber der Grund, warum andere das Argument für die zweite Form anführen, ist, dass es dieses Problem (meistens) löst:

int* x,y; // "x is a pointer to int, y is an int"

was möglicherweise irreführend ist; stattdessen würden Sie entweder schreiben

int *x,y; // it's a little clearer what is going on here

oder wenn Sie wirklich zwei Zeiger wollen,

int *x, *y; // two pointers

Ich persönlich sage, halten Sie eine Variable pro Zeile, dann ist es egal, welchen Stil Sie bevorzugen.

11
huskerchad

In 4, 5 und 6 ist test immer ein Zeiger und test2 kein Zeiger. Leerzeichen sind in C++ (fast) nie von Bedeutung.

5

Sie können sich 4, 5 und 6 wie folgt vorstellen: Das Deklarieren des Typs muss nur einmal ausgeführt werden. Wenn Sie jedoch einen Zeiger auf diesen Typ deklarieren möchten (indem Sie ein Sternchen hinzufügen), müssen Sie dies für jeden tun Variable.

Bei der Deklaration einer Zeigervariable füge ich immer Leerzeichen zwischen der Variablen und dem Sternchen hinzu, auch wenn ich mehr als einen in einer Zeile deklariere. Wenn ich das nicht mache, verwirrt es mich fast immer für einen dereferenzierenden Ausdruck.

1
dxh

Der Zeiger ist ein Modifikator für den Typ. Lesen Sie sie am besten von rechts nach links, um besser zu verstehen, wie der Stern den Typ ändert. 'int *' kann als "Zeiger auf int" gelesen werden. In mehreren Deklarationen müssen Sie angeben, dass jede Variable ein Zeiger ist. Andernfalls wird sie als Standardvariable erstellt.

1,2 und 3) Test ist vom Typ (int *). Whitespace spielt keine Rolle.

4,5 und 6) Test ist vom Typ (int *). Test2 ist vom Typ int. Wieder ist Whitespace inkonsequent.

1
Ron Warholic

Der Grund in C ist, dass Sie die Variablen so deklarieren, wie Sie sie verwenden. Zum Beispiel

char *a[100];

sagt, dass *a[42] eine char ist. Und a[42] ein Zeichenzeiger. Und somit ist a ein Array von Zeichenzeigern.

Dies liegt daran, dass die ursprünglichen Compiler-Autoren denselben Parser für Ausdrücke und Deklarationen verwenden wollten. (Nicht ein sehr vernünftiger Grund für die Auswahl einer Sprache)

0
Michel Billaud

Meiner Meinung nach ist es besser, den Stern neben dem Zeigernamen zu platzieren, als den Typ. Vergleiche z.B.

int *pointer1, *pointer2; // Fully consistent, two pointers
int* pointer1, pointer2;  // Inconsistent, unexpected, and thus prone to errors

Warum ist der zweite Fall inkonsistent? Weil z.B. int x,y; deklariert zwei Variablen desselben Typs, der Typ wird jedoch nur einmal in der Deklaration erwähnt. Dies schafft ein Präzedenzfall und erwartetes Verhalten. Und int* pointer1, pointer2; ist damit nicht vereinbar.

0
deLock

Ich würde sagen, die anfängliche Konvention bestand darin, den Stern auf der Zeigernamenseite (rechte Seite der Deklaration) zu platzieren

Sie können denselben Regeln folgen, aber es ist keine große Sache, wenn Sie Sterne auf die Typenseite setzen .. _. Denken Sie daran, dass consistency wichtig ist, also immer der Stern auf derselben Seite, unabhängig davon, welche Seite Sie haben wählen. 

0
TheDrev