Wie funktioniert das Übergeben eines statisch zugewiesenen Arrays als Referenz?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
Hat (&myArray)[100]
es eine Bedeutung oder ist es nur eine Syntax, um ein Array als Referenz zu übergeben? Ich verstehe hier keine separate Klammer, gefolgt von großen Klammern. Vielen Dank.
Antworten:
Dies ist eine Syntax für Array-Referenzen. Sie müssen
(&array)
dem Compiler klarstellen, dass Sie einen Verweis auf ein Array anstelle des (ungültigen) Referenz-Arrays wünschenint & array[100];
.EDIT: Einige Klarstellungen.
Diese drei sind verschiedene Arten, dieselbe Funktion zu deklarieren. Sie werden alle als
int *
Parameter behandelt. Sie können ihnen ein Array beliebiger Größe übergeben.Dies akzeptiert nur Arrays mit 100 Ganzzahlen. Sie können sicher
sizeof
auf verwendenx
Dies wird als "Array von Referenzen" analysiert - was nicht legal ist.
quelle
int a, b, c; int arr[3] = {a, b, c};
.void foo(int & x[100]);
bitte erklären, warum als "Array von Referenzen" analysiert wird? Liegt es an der Regel "von rechts nach links"? Wenn ja, scheint dies nicht mit dervoid foo(int (&x)[100]);
Analyse als "Referenz auf ein Array" übereinzustimmen. Danke im Voraus.Es ist nur die erforderliche Syntax:
^ Übergeben Sie ein Array von 100 als
int
Referenz. Der Parametername lautetmyArray
.^ Übergeben Sie ein Array. Array zerfällt in einen Zeiger. Dadurch verlieren Sie Größeninformationen.
^ Übergeben Sie einen Funktionszeiger. Die Funktion gibt ein zurück
int
und nimmt eindouble
. Der Parametername lautetmyFunc
.quelle
Es ist eine Syntax. In den Funktionsargumenten sind
int (&myArray)[100]
Klammern&myArray
erforderlich , die das einschließen . Wenn Sie sie nicht verwenden, werden Sie ein übergeben,array of references
und das liegt daran, dass dassubscript operator []
einen höheren Vorrang vor dem hat& operator
.Z.B
int &myArray[100] // array of references
Wenn
type construction ()
Sie also verwenden, teilen Sie dem Compiler mit, dass Sie einen Verweis auf ein Array mit 100 Ganzzahlen wünschen.Z.B
int (&myArray)[100] // reference of an array of 100 ints
quelle
array of references
" - was natürlich nicht existieren kann, sodass Sie einen Kompilierungsfehler erhalten. Es ist amüsant für mich, dass die Operator-Prioritätsregeln darauf bestehen, dass dies ohnehin standardmäßig geschehen muss.Arrays werden standardmäßig von Zeigern übergeben. Sie können versuchen, ein Array innerhalb eines Funktionsaufrufs zum besseren Verständnis zu ändern.
quelle
char arr[1]; foo(char arr[]).
arr verwenden , wird es zu einem Zeiger. Während der Verwendungchar arr[1]; foo(char (&arr)[1])
wird arr als Referenz übergeben. Es ist bemerkenswert, dass die frühere Form oft als schlecht geformt angesehen wird, da die Dimension verloren geht.foo(T* t)
haben und ein Array haben,T a[N];
dann ist esfoo(a);
meiner Meinung nach korrekter zu sagen, dass Sie beim Schreiben einen Zeiger übergeben, kein Array, und den Zeiger als Wert übergeben.Im Folgenden wird eine generische Funktion erstellt, die ein Array beliebiger Größe und beliebigen Typs als Referenz verwendet:
spiele mit dem Code.
quelle