2016-01-27 6 views
5

Gibt es einen Unterschied zwischen zwei Funktionen in C?Was ist der Unterschied zwischen foo (int arr []) und foo (int arr [10])?

void f1(int arr[]) {  
//some code... 
} 
void f2(int arr[10]) { 
//some code 
} 

Wie groß wird das erste Array in der f1-Funktion sein?

+4

Es gibt keinen Unterschied, außer dass es im zweiten Fall etwas selbstdokumentierend ist. 'arr' zerfällt entweder in einen Zeiger. –

+0

Nun, Sie können einige Tests durchführen, versuchen Sie, "printf (" sizeof arr ==% d \ n ", sizeof arr);' und sehen was passiert. –

Antwort

6

Gibt es einen Unterschied zwischen zwei Funktionen in c?

Kein Unterschied hier. Beide werden vom Compiler als interpretiert, da Arrays in einen Zeiger auf ihr erstes Element konvertiert werden, wenn sie als Funktionsparameter verwendet werden.

Wie groß wird das erste Array in der f1-Funktion sein?

Genau genommen gibt es hier kein Array. Sein einziger Zeiger auf eine int. Wenn Sie sizeof(arr) verwenden, erhalten Sie den Wert sizeof(int *).

Die Array-Größe in Parametern wird benötigt, wenn der Typ des Parameters ein Zeiger auf ein Array ist. In diesem Fall müssen Sie die Größe des Arrays angeben, da jede Größe den Zeiger auf einen anderen Typ zeigt.

void f3(int (*arr)[10]); // Expects a pointer to an array of 10 int 
+0

Welches ist die beste Praxis void f1 (int arr [10]) oder void f2 (int arr []) oder void f3 (int (* arr) ([10]))? –

+0

Seine Sache der Wahl, aber 'f3 (int (* arr) ([10]))' ist ganz anders und Sie können nicht anstelle von 'f1 (int arr [10])' (oder 'f2 (int arr []) '). – haccks

+0

Wie unterscheidet sich f3 (int (* arr) ([10])) von den anderen beiden? –

3

Wenn ein Array an eine Funktion übergeben wird, zerfällt es in einen Zeiger auf das erste Element des Arrays.

So folgt aus:

void f1(int arr[]) 

Und:

void f1(int arr[10]) 

Und:

void f1(int *arr) 

Sind alle gleichwertig.

In der Tat, wenn Sie int a[20] an eine Funktion übergeben, die int arr[10] zu nehmen deklariert, gcc wird nicht beschweren.

+0

Wichtig ist, wenn Sie 'int a [5]' an eine Funktion übergeben, die deklariert wird, 'int arr [10]' zu nehmen, dann wird sich der Compiler * still * nicht beschweren. Die explizite Dimension ist allenfalls ein Hinweis für Programmierer, was die Funktion erwartet. Es wird nicht von einem entsprechenden Compiler erzwungen. –

+0

Um pedantisch zu sein, wird ein Array-Ausdruck in einen Zeigerausdruck umgewandelt * wann immer der Array-Ausdruck auftritt * (nicht nur wenn er als Funktionsparameter übergeben wird), es sei denn, es ist der Operand der 'sizeof' oder unary' & operators ist ein String-Literal, das zur Initialisierung eines Arrays in einer Deklaration verwendet wird. –

Verwandte Themen