Übergeben eines Arrays als Referenz

184

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.

John DB
quelle
Gibt es eine Beziehung zwischen RWert und LWert zu den Funktionsparametern?
John DB

Antworten:

228

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ünschen int & array[100];.

EDIT: Einige Klarstellungen.

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);

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.

void foo(int (&x)[100]);

Dies akzeptiert nur Arrays mit 100 Ganzzahlen. Sie können sicher sizeofauf verwendenx

void foo(int & x[100]); // error

Dies wird als "Array von Referenzen" analysiert - was nicht legal ist.

Erik
quelle
Warum können wir nicht eine Reihe von Referenzen haben, z int a, b, c; int arr[3] = {a, b, c};.
Vorac
4
Aha, fand heraus warum .
Vorac
2
Könnte jemand 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 der void foo(int (&x)[100]);Analyse als "Referenz auf ein Array" übereinzustimmen. Danke im Voraus.
zl9394
3
Es ist nicht von rechts nach links, es ist von innen nach außen und [] bindet fester als &.
Philipip
48

Es ist nur die erforderliche Syntax:

void Func(int (&myArray)[100])

^ Übergeben Sie ein Array von 100 als intReferenz. Der Parametername lautet myArray.

void Func(int* myArray)

^ Übergeben Sie ein Array. Array zerfällt in einen Zeiger. Dadurch verlieren Sie Größeninformationen.

void Func(int (*myFunc)(double))

^ Übergeben Sie einen Funktionszeiger. Die Funktion gibt ein zurück intund nimmt ein double. Der Parametername lautet myFunc.

Martin York
quelle
Wie übergeben wir ein Array mit variabler Größe als Referenz?
Shivam Arora
@ShivamArora Sie erstellen eine Vorlage für die Funktion und machen die Größe zu einem Vorlagenparameter.
Martin York
24

Es ist eine Syntax. In den Funktionsargumenten sind int (&myArray)[100]Klammern &myArrayerforderlich , die das einschließen . Wenn Sie sie nicht verwenden, werden Sie ein übergeben, array of referencesund das liegt daran, dass das subscript 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

cpx
quelle
"Wenn Sie sie nicht verwenden, übergeben Sie ein 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.
underscore_d
Gibt es noch ein Tutorial zur Typkonstruktion ()?
Chief Shifter
Vielen Dank, ich brauchte eine Erklärung, die den Grund für die Priorität des Operators enthielt, was einen Sinn dafür gibt, warum dies so gemacht werden sollte.
Cram2208
4

Arrays werden standardmäßig von Zeigern übergeben. Sie können versuchen, ein Array innerhalb eines Funktionsaufrufs zum besseren Verständnis zu ändern.

Eduardo A. Fernández Díaz
quelle
2
Arrays können nicht als Wert übergeben werden. Wenn die Funktion einen Zeiger empfängt, zerfällt ein Array in einen Zeiger auf sein erstes Element. Ich bin mir nicht sicher, was Sie hier sagen wollen.
Ulrich Eckhardt
@UlrichEckhardt Ich versuche zu sagen, dass "Arrays nicht als Wert übergeben werden können", wie Sie zuvor sagten, sie werden standardmäßig als Referenz übergeben
Eduardo A. Fernández Díaz
8
Arrays werden weder als Wert noch als Referenz übergeben. Sie werden von Zeigern übergeben. Wenn Arrays standardmäßig als Referenz übergeben werden, können Sie sie problemlos mit sizeof verwenden. Das ist aber nicht der Fall. Arrays zerfallen in Zeiger, wenn sie an eine Funktion übergeben werden.
user3437460
2
Arrays können als Referenz ODER übergeben werden, indem sie zu einem Zeiger herabgesetzt werden. Wenn Sie beispielsweise char arr[1]; foo(char arr[]).arr verwenden , wird es zu einem Zeiger. Während der Verwendung char 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.
zl9394
Betreff: "Arrays werden ... von Zeigern übergeben." Diese Beschreibung klingt bestenfalls unkonventionell und kann für Neulinge verwirrend sein. Der Name einer Array-Variablen ist ein gültiger Ausdruck, dessen Wert ein Zeiger auf das erste Mitglied des Arrays ist. Wenn Sie eine Funktion foo(T* t)haben und ein Array haben, T a[N];dann ist es foo(a);meiner Meinung nach korrekter zu sagen, dass Sie beim Schreiben einen Zeiger übergeben, kein Array, und den Zeiger als Wert übergeben.
Solomon Slow
1

Im Folgenden wird eine generische Funktion erstellt, die ein Array beliebiger Größe und beliebigen Typs als Referenz verwendet:

template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
   // do stuff
}

spiele mit dem Code.

User12547645
quelle