2012-08-26 15 views
5

Ich verstehe, wie Arrays zu Zeigern zerfallen. Ich verstehe, dass, für den Compiler, dies:Array-Syntax vs. Pointer-Syntax in C-Funktionsparameter

void foo(int *arg1); 

100% entspricht dies:

void foo(int arg1[]); 

Sollte eine Art gegenüber den anderen bevorzugt werden? Ich möchte konsequent sein, aber es fällt mir schwer, eine Entscheidung zu rechtfertigen.

Obwohl int main(int argc, char *argv[]) und int main(int argc, char **argv) die gleichen sind, scheint ersteres viel häufiger zu sein (korrigiert mich, wenn ich falsch liege).

+3

Wenn Ihr Ziel Konsistenz ist, sollten Sie das Sternchen verwenden, da dies mit normalen (Nicht-Parameter-) Deklarationen übereinstimmt. Die andere Syntax sollte sterben, sie verursacht nur Verwirrung. –

Antwort

7

Ich würde empfehlen gegen mit der [] Syntax für Funktionsparameter.

Das einzige Argument für die Verwendung von [] ist, dass es auf eine selbstdokumentierende Weise impliziert, dass der Zeiger auf mehr als eine Sache zeigen soll. Zum Beispiel:

void swap(int *x, int *y) 
double average(int vals[], int n) 

Aber warum ist dann char * immer für Strings statt char []? Ich würde lieber konsistent sein und immer * verwenden.

Einige Leute mögen const alles, was sie können, einschließlich Pass-by-Value-Parameter. Die Syntax für dass, wenn [] (nur in C99) unter Verwendung von weniger intuitiv und wahrscheinlich weniger bekannt:

const char *const *const words gegen const char *const words[const]

Obwohl halte ich, dass die endgültigen const Overkill in jedem Fall sein.

Darüber hinaus ist die Art, wie Arrays Zerfall nicht vollständig intuitiv ist. Insbesondere ist es not applied recursively (char words[][] funktioniert nicht). Vor allem, wenn Sie anfangen, mehr Indirection werfen, verursacht die [] Syntax nur Verwirrung. IMO ist es besser, immer die Pointer-Syntax zu verwenden, anstatt vorzugeben, dass ein Array als Argument übergeben wird.

Weitere Informationen: .

+0

ist es sicherer, [] diese Syntax dann * one zu verwenden? –

+0

Was meinst du mit sicher? – mk12

+0

Ich meine sicher vor potentiellen Zeigergefahren –

3

Außer char*, verwende ich Type array[N], wobei N eine Zahl oder eine definierte Konstante ist, wenn der übergebene Artikel konzeptuell ein Array ist (dh es N> 1 Elemente enthält), Type * pointer, wenn das übergebene Element ein Zeiger ist genau ein Objekt.

Ich neige dazu, std::vector zu verwenden, wenn das Array eine variable Größe hat. Das C99-Konzept von Arrays variabler Größe ist in C++ nicht verfügbar.

+0

Aber das 'N' wird still ignoriert, was ich irreführend finde. –

+0

@KeithThompson: Sie sind richtig; der Compiler ignoriert es. Sie schreiben jedoch nicht nur für den Compiler, sondern schreiben auch für den menschlichen Benutzer Ihres Codes. Dass Arrays in Zeiger zerfallen, ist einer der größten Fehler in C/C++ aus der Perspektive eines wissenschaftlichen Programmierers. Es gibt keinen Grund, sich diesem riesigen klaffenden Fehler hinzugeben. –

+0

Was wäre, wenn Sie einen Zeiger auf ein Array von Zeichenfolgen hätten (d. H. Char-Zeiger für die Zeichenfolge, Zeiger auf char-Zeiger für Wörter, Zeiger auf Zeiger auf char-Zeiger, damit die Funktion darauf schreiben kann)? 'char * (* words [])'? IMO 'char *** words' sieht besser aus und lässt sich auf einen Blick leichter aufnehmen. Ich nehme jedoch an, dass diese Art von Sache in C häufiger vorkommt (was mich hauptsächlich interessiert) als C++. – mk12