2010-01-24 7 views
7

Was ist der Unterschied zwischen float * varname und float * varname in classic C?Was ist der Unterschied zwischen float * varname und float * varname in classic c

+0

Es gibt keinen Unterschied, der Compiler ist so oder so glücklich. "C" -Programmierer neigen dazu, das Leerzeichen nach dem Typnamen zu bevorzugen, verursacht weniger Verwirrung, wenn Sie mehr als eine Variable deklarieren. Dies * muss * düpiert werden. –

+1

Sie haben eine religiöse Dose Würmer geöffnet. :) Ich bin überrascht, dass die meisten Antworten bisher mild gesinnt sind. –

+1

War das nicht gestern gefragt, aber stattdessen war 'int' der Typ? Und die Frage von gestern war ein Duplikat eines Duplikats eines Duplikats? –

Antwort

22

Formatieren. Das ist es. Sie meinen das Gleiche.

Wo Sie den Platz (oder wenn Sie sogar einen wirklich haben), ist eine Frage der Präferenz. Einige der bevorzugen * neben dem varname so dass Sie nicht verwirrt durch so etwas wie:

float* a, b; 

(hier nur ein Zeiger, b nicht)

Andere argumentieren, dass sie nie erklären mehrere Variablen gleichzeitig, so bevorzugen sie das * neben float, da es Teil des Typs ist.

+0

Prost Kumpel nur checking :) – PeanutPower

+2

Man fragt sich, wie diejenigen, die das '*' neben ' Float, weil "es ein Teil des Typs ist", Arrays zu deklarieren. – caf

+0

Sie verwenden typedefs. –

8

Es gibt keinen Unterschied. Das Leerzeichen wird vollständig ignoriert.

ist jedoch zu beachten, dass die folgende irreführend sein kann:

float* var1, var2; 

Gelegenheits Prüfung der oben würden Sie führen zu glauben, dass beide var1 und var2 sind Zeiger auf einen Schwimmer. Allerdings liegst du falsch, weil dies var1 als Zeiger auf einen Gleitkommawert deklariert, aber var2 wäre ein regulärer Gleitkommawert.

+0

Es ist eine interessante Sache, dass C das * mehr mit dem Variablennamen assoziiert als mit dem Zeiger-to-Typ. Sie möchten, dass der alte Pascal-Doppelpunkt als Disambiguierung dient - trennen Sie den gemeinsam genutzten Typ von der Liste der Namen mit Modifikatoren. – Steve314

+1

@ Steve314 Aber denken Sie darüber nach, was passiert, wenn Sie 'typedef int * foo_t;' haben, dann 'foo_t a, b, c;'. An diesem Punkt "berücksichtigt" C das mit dem Typ assoziierte "*". (Obwohl ich behaupten würde, dass die C-Sprache nichts wirklich "in Betracht zieht" ...) – asveikau

4

Letzteres ist expliziter, da es zeigt, dass Sie eine Variable erstellen, die ein Zeiger auf einem Float ist, anstatt eine Variable zu erstellen, die ein Float-Zeiger ist. Dies wird wichtig in Konstrukten wie zum Beispiel:

foo ist ein Zeiger auf einen Schwimmer, aber Bar ist nur ein Schwimmer.

1

Meistens ist es eine Frage der Codierung Stil. Die meisten C-Programmierer bevorzugen jedoch die zweite Option: float *var;, da es näher daran ist, wie die Sprachsyntax die * Sternchen bindet: die * ist an den Deklarator gebunden, nicht der Spezifizierer des Typs.

Mit anderen Worten übersetzen C-Programmierer float *var als *var ist der Art des Float. aber nicht var ist vom Typ float*.

Es gibt kompliziertere Erklärung in Wikipedia-Artikel C variable types and declarations

Auch können Sie die Frage C Pointer Syntax: Style poll interesing finden.

0

Wie andere sagten, macht es keinen Unterschied - Stilsache. Beachten Sie, dass in C++ ist es üblich, zu schreiben:

type* var; 

Da der Zeigerteil des Typs ist - zumindest für benutzerdefinierte Typen wahr. Aber auch für eingebaute Typen. Es macht also in C einen Sinn, dasselbe zu tun, um konsistent zu sein. Persönlich finde ich es intuitiver, einen Zeigerteil des Typs zu haben.

0

Es gibt praktisch keinen Unterschied; Die Deklaration wird geparst als ob es geschrieben wurde float (*varname);.

Sowohl in C als auch in C++ sind die Deklarationen um Ausdrücke zentriert, keine Objekte; Grundsätzlich sollte die Form der Deklaration mit der Form des Ausdrucks in ausführbarem Code übereinstimmen (IOW, Verwendung der Deklaration). Zum Beispiel, wenn Sie einen Zeiger auf eine ganze Zahl genannt p und Sie wollen, dass Wert integer Zugriff dass p Punkte, Sie Dereferenzierung der Zeiger wie folgt:

x = *p; 

Der Typ des Ausdruck*p ist int; Somit sollte die Erklärung

aussehen
int *p; 

Und falls Sie ein Array von int genannt haben arr und Sie den ganzzahligen Wert zu einem bestimmten Element i zugreifen möchten, würden Sie

schreiben
x = a[i]; 

Die Typ der Ausdrucka[i] ist Int; Somit sollte die Erklärung aussehen

int a[N]; 

In den obigen Beispielen, *p und a[N] sind Deklaratoren genannt; Deklaratoren führen den Namen des deklarierten Objekts zusammen mit zusätzliche Typinformationen ein, die nicht im Typspezifizierer enthalten sind. Die Int-Werte von sowohl p als auch a werden durch den Typspezifizierer int bereitgestellt, aber die Zeiger-Ness von und die Array-Ness von a werden von ihren entsprechenden Deklaratoren bereitgestellt.

Dies ist ein wichtiger Punkt, und etwas, das betont werden muss; Die * von und int* p; ist an den Deklarator gebunden, nicht der Typspezifizierer, unabhängig von Leerzeichen. Die Tatsache, dass Sie es so oder so schreiben können, ist ein Zufall von C (und C++) Syntax, und als Ergebnis gibt es eine Schule des Gedankens, dass Zeigervariablen als T* p; im Gegensatz zu T *p; deklariert werden sollten, da der Typ von p ist "Zeiger auf T". Mein Problem ist, dass die Argumentation nur für einfache Zeigertypen funktioniert; Array- oder Funktionstypen können nicht auf die gleiche Weise behandelt werden. Zum Beispiel können wir int[N] arr; nicht schreiben, obwohl der Typ von arr "N-Element-Array von int" ist. Es fällt wirklich, wenn wir Zeiger auf Arrays oder Zeiger auf Funktionen oder Kombinationen von solchen deklarieren. Zum Beispiel:

int *(*(*(*farr)())[N])(); 

Der Typ vonfarr ist „Zeiger auf eine Funktion einen Zeiger auf ein N-Element-Array von Zeigern auf Funktionen zurückkehr Zeiger auf int Rückkehr“. Alles andere als "int" ist Teil des Deklarators; Schreiben int* (*(*(*farr)())[N])(); oder sogar int*(*(*(* farr)())[N])(); wäre einfach ... albern.

Ich glaube, dass das Bestehen auf T* p; für Zeiger Deklarationen führt zu mehr Verwirrung, nicht weniger.So wie Stroustrup und Legionen von C++ - Programmierern gerne etwas anderes vortäuschen würden, sind Deklarationen in C und C++ um Ausdrücke, keine Objekte zentriert.

Da ich Teil eines größeren Team zu schreiben C++ Code bin, folge ich den vereinbarten Leitlinien Codierung, die Zeiger und Referenzen als T* p; und T& r; umfassen erklärt, aber es macht mir meine Zähne jedes Mal schleifen ich es zu tun haben, .

Verwandte Themen