142 Stimmen

Platzierung des Sternchens in Zeigerdeklarationen

Ich habe kürzlich beschlossen, dass ich endlich C/C++ lernen muss, und es gibt eine Sache, die ich nicht wirklich über Zeiger verstehe, genauer gesagt, ihre Definition.

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;

Nun, nach meinem Verständnis, die ersten drei Fälle sind alle das gleiche tun: Test ist nicht ein int, aber ein Zeiger auf ein.

Die zweite Gruppe von Beispielen ist etwas komplizierter. In Fall 4 sind sowohl test als auch test2 Zeiger auf einen int, während in Fall 5 nur test ein Zeiger ist, während test2 ein "echter" int ist. Was ist mit Fall 6? Dasselbe wie in Fall 5?

19 Stimmen

In C/C++ ändern Leerzeichen die Bedeutung nicht.

38 Stimmen

7. int*test; ?

4 Stimmen

+1, denn ich hatte nur daran gedacht, nach 1 - 3 zu fragen. Beim Lesen dieser Frage habe ich etwas über 4 - 6 gelernt, woran ich nie gedacht hatte.

15voto

huskerchad Punkte 996

Wie bereits von anderen erwähnt, sind 4, 5 und 6 dasselbe. Oft werden diese Beispiele verwendet, um zu argumentieren, dass die * gehört zur Variablen und nicht zum Typ. Es ist zwar eine Frage des Stils, aber es gibt eine Debatte darüber, ob man das so sehen und schreiben sollte:

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

oder auf diese Weise:

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

Ich gehöre zum ersten Lager, aber der Grund, warum andere für die zweite Form plädieren, ist, dass sie (meistens) dieses spezielle Problem löst:

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

was potenziell 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 haben wollen,

int *x, *y; // two pointers

Ich persönlich würde es bei einer Variablen pro Zeile belassen, dann ist es egal, welchen Stil Sie bevorzugen.

8 Stimmen

Das ist ein Schwindel, wie nennt man das int *MyFunc(void) ? a *MyFunc ist eine Funktion, die eine int ? nein. Offensichtlich sollten wir schreiben int* MyFunc(void) und sagen MyFunc ist eine Funktion, die eine int* . Für mich ist also klar, dass die Regeln für das Parsen der C- und C++-Grammatik für die Variablendeklaration einfach falsch sind.

3 Stimmen

Aber *MyFunc() es eine int . Das Problem mit der C-Syntax ist die Vermischung Präfix y Postfix Syntax - wenn sólo postfix verwendet würde, gäbe es keine Verwechslungen.

6 Stimmen

Das erste Lager kämpft mit der Syntax der Sprache, was zu verwirrenden Konstrukten wie int const* x; was ich ebenso irreführend finde wie a * x+b * y .

11voto

fredoverflow Punkte 245881
#include <type_traits>

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

0 Stimmen

#include <windows.h>LPINT test, test2;

5voto

1800 INFORMATION Punkte 125009

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

4voto

Michel Billaud Punkte 1678

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

char *a[100];

sagt, dass *a[42] wird ein char . Und a[42] ein Zeichen-Zeiger. Und somit a ist ein Array von Char-Zeigern.

Dies liegt daran, dass die ursprünglichen Compilerautoren denselben Parser für Ausdrücke und Deklarationen verwenden wollten. (Kein sehr vernünftiger Grund für die Wahl des Sprachdesigns)

0 Stimmen

Doch das Schreiben char* a[100]; también folgert daraus, dass *a[42]; wird ein char y a[42]; ein Zeichen-Zeiger.

0 Stimmen

Nun, wir kommen alle zu den gleichen Schlussfolgerungen, nur die Reihenfolge ist unterschiedlich.

0 Stimmen

Zitat: "sagt, dass *a[42] ein char sein wird. Und a[42] ein char-Zeiger". Sind Sie sicher, dass es nicht andersherum ist?

3voto

TheDrev Punkte 430

Ich würde sagen, dass die ursprüngliche Konvention darin bestand, den Stern auf die Seite des Zeigernamens zu setzen (rechte Seite der Erklärung

Sie können die gleichen Regeln befolgen, aber es ist nicht schlimm, wenn Sie die Sterne auf die Schriftseite setzen. Denken Sie daran, dass Konsistenz ist wichtig, daher sollte der Stern immer auf derselben Seite stehen, egal welche Seite Sie gewählt haben.

0 Stimmen

Nun - der Parser scheint beide Varianten zuzulassen, aber wenn Dennis und Linus sagen, dass es auf der rechten Seite sein sollte, ist das ziemlich überzeugend. Aber trotzdem fehlt uns irgendwie eine Begründung, und dann auch die Erklärung, warum das so gemacht wird. Es ist ein bisschen wie die Situation zwischen Tabulator und Leerzeichen - nur dass diese gelöst wurde, weil Leute, die Leerzeichen statt Tabulatoren verwenden, mehr Geld verdienen, laut StackOverflow ... :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X