Wie funktioniert das Übergeben eines statisch zugewiesenen Arrays als Referenz?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
Tut (&myArray)[100] eine Bedeutung haben oder nur eine Syntax, um ein Array als Referenz zu übergeben? Ich verstehe hier keine separaten Klammern gefolgt von großen Klammern. Danke.
Gibt es eine Rvalue-zu-Lvalue-Beziehung mit den Funktionsparametern?
– Johannes DB
20. April 2011 um 0:16 Uhr
mögliches Duplikat von Was ist nützlich an einem Referenz-auf-Array-Parameter?
– Ant
20. April 2011 um 0:25 Uhr
Erik
Es ist eine Syntax für Array-Referenzen – die Sie verwenden müssen (&array) um dem Compiler zu verdeutlichen, dass Sie einen Verweis auf ein Array und nicht auf das (ungültige) Array von Verweisen wünschen int & array[100];.
Diese drei sind verschiedene Möglichkeiten, dieselbe Funktion zu deklarieren. Sie werden alle so behandelt, als würden sie eine nehmen int * -Parameter können Sie ihnen Arrays beliebiger Größe übergeben.
void foo(int (&x)[100]);
Dies akzeptiert nur Arrays mit 100 Ganzzahlen. Sie können sicher verwenden sizeof an x
void foo(int & x[100]); // error
Dies wird als “Array von Referenzen” geparst – was nicht legal ist.
Warum können wir nicht ein Array von Referenzen haben, z int a, b, c; int arr[3] = {a, b, c};?
– Vorac
7. Januar 2016 um 13:10 Uhr
Aha, herausgefunden warum.
– Vorac
8. Januar 2016 um 13:51 Uhr
Könnte jemand erklären warum void foo(int & x[100]); wird bitte als “Array von Referenzen” analysiert? Liegt es an der “von-rechts-nach-links”-Regel? Wenn ja, scheint es nicht mit dem Wie übereinzustimmen void foo(int (&x)[100]); wird als “ein Verweis auf ein Array” analysiert. Vielen Dank im Voraus.
– zl9394
11. Februar 2017 um 0:52 Uhr
Es ist nicht von rechts nach links, es ist von innen nach außen und [] bindet fester als &.
– Philippie
6. Mai 2017 um 3:10 Uhr
Martin York
Es ist nur die erforderliche Syntax:
void Func(int (&myArray)[100])
^ Übergeben Sie ein Array von 100 int als Referenz ist der Name des Parameters myArray;
void Func(int* myArray)
^ Übergeben Sie ein Array. Array zerfällt zu einem Zeiger. Dadurch gehen Ihnen Größeninformationen verloren.
void Func(int (*myFunc)(double))
^ Übergeben Sie einen Funktionszeiger. Die Funktion gibt ein zurück int und nimmt ein double. Der Parametername ist myFunc.
Wie übergeben wir ein Array mit variabler Größe als Referenz?
– Shivam Arora
29. Juni 2017 um 8:07 Uhr
@ShivamArora Sie erstellen die Funktion als Vorlage und machen die Größe zu einem Vorlagenparameter.
– Martin York
29. Juni 2017 um 15:53 Uhr
cpx
Es ist eine Syntax. In den Funktionsargumenten int (&myArray)[100] Klammern, die die einschließen &myArray sind notwendig. Wenn Sie sie nicht verwenden, passieren Sie eine array of references und das liegt daran, dass die subscript operator [] hat Vorrang vor dem & operator.
Z.B int &myArray[100] // array of references
Also durch Nutzung type construction () Sie teilen dem Compiler mit, dass Sie einen Verweis auf ein Array von 100 Ganzzahlen wünschen.
Z.B int (&myArray)[100] // reference of an array of 100 ints
“Wenn Sie sie nicht verwenden, passieren Sie eine array of references” – was natürlich nicht existieren kann, also würden Sie einen Kompilierungsfehler erhalten. Es ist amüsant für mich, dass die Operator-Präzedenzregeln darauf bestehen, dass dies sowieso standardmäßig geschehen muss.
– Unterstrich_d
30. August 2016 um 15:27 Uhr
Gibt es noch mehr Tutorials zur Typkonstruktion () ?
– iartist93
1. Dezember 2016 um 19:32 Uhr
Danke, ich brauchte eine Erklärung, die den Grund für die Operatorpriorität enthielt, was einen Sinn dafür gibt, warum es so gemacht werden sollte.
– cram2208
7. November 2017 um 5:43 Uhr
Im Folgenden wird eine generische Funktion erstellt, die ein Array beliebiger Größe und beliebigen Typs als Referenz verwendet:
Arrays werden standardmäßig von Zeigern übergeben. Sie können versuchen, ein Array innerhalb eines Funktionsaufrufs zum besseren Verständnis zu ändern.
Arrays können nicht als Wert übergeben werden. Wenn die Funktion einen Zeiger erhält, zerfällt ein Array zu einem Zeiger auf sein erstes Element. Ich bin mir nicht sicher, was Sie hier sagen wollen.
– Ulrich Eckhardt
19. Juli 2015 um 8:50 Uhr
@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
24. Juli 2015 um 21:52 Uhr
Arrays werden weder als Wert noch als Referenz übergeben. Sie werden von Zeigern übergeben. Wenn Arrays standardmäßig als Referenz übergeben werden, haben Sie kein Problem damit, sizeof für sie zu verwenden. Aber das ist nicht der Fall. Arrays zerfallen zu Zeigern, wenn sie an eine Funktion übergeben werden.
– Benutzer3437460
27. Mai 2016 um 16:43 Uhr
Arrays können per Referenz ODER durch Degradieren zu einem Zeiger übergeben werden. Zum Beispiel mit char arr[1]; foo(char arr[])., arr wird zu einem Zeiger; während dem Benutzen char arr[1]; foo(char (&arr)[1]), arr wird als Referenz übergeben. Es ist bemerkenswert, dass die frühere Form oft als schlecht geformt angesehen wird, da die Dimension verloren geht.
– zl9394
11. Februar 2017 um 0:14 Uhr
Betreff: “Arrays werden … von Zeigern übergeben.” Diese Beschreibung klingt bestenfalls unkonventionell und kann für Neulinge verwirrend sein. Die Name einer Array-Variablen ist ein gültiger Ausdruck, dessen Wert ein Zeiger auf das erste Element des Arrays ist. Wenn Sie eine Funktion haben foo(T* t)und Sie haben ein Array T a[N]; dann wenn du schreibst foo(a); Ich denke, es wäre richtiger zu sagen, dass Sie einen Zeiger übergeben, kein Array, und Sie übergeben den Zeiger als Wert.
– Solomon Langsam
15. Juni 2020 um 15:09 Uhr
Arrays können nicht als Wert übergeben werden. Wenn die Funktion einen Zeiger erhält, zerfällt ein Array zu einem Zeiger auf sein erstes Element. Ich bin mir nicht sicher, was Sie hier sagen wollen.
– Ulrich Eckhardt
19. Juli 2015 um 8:50 Uhr
@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
24. Juli 2015 um 21:52 Uhr
Arrays werden weder als Wert noch als Referenz übergeben. Sie werden von Zeigern übergeben. Wenn Arrays standardmäßig als Referenz übergeben werden, haben Sie kein Problem damit, sizeof für sie zu verwenden. Aber das ist nicht der Fall. Arrays zerfallen zu Zeigern, wenn sie an eine Funktion übergeben werden.
– Benutzer3437460
27. Mai 2016 um 16:43 Uhr
Arrays können per Referenz ODER durch Degradieren zu einem Zeiger übergeben werden. Zum Beispiel mit char arr[1]; foo(char arr[])., arr wird zu einem Zeiger; während dem Benutzen char arr[1]; foo(char (&arr)[1]), arr wird als Referenz übergeben. Es ist bemerkenswert, dass die frühere Form oft als schlecht geformt angesehen wird, da die Dimension verloren geht.
– zl9394
11. Februar 2017 um 0:14 Uhr
Betreff: “Arrays werden … von Zeigern übergeben.” Diese Beschreibung klingt bestenfalls unkonventionell und kann für Neulinge verwirrend sein. Die Name einer Array-Variablen ist ein gültiger Ausdruck, dessen Wert ein Zeiger auf das erste Element des Arrays ist. Wenn Sie eine Funktion haben foo(T* t)und Sie haben ein Array T a[N]; dann wenn du schreibst foo(a); Ich denke, es wäre richtiger zu sagen, dass Sie einen Zeiger übergeben, kein Array, und Sie übergeben den Zeiger als Wert.
– Solomon Langsam
15. Juni 2020 um 15:09 Uhr
9929900cookie-checkÜbergeben eines Arrays als Referenzyes
Gibt es eine Rvalue-zu-Lvalue-Beziehung mit den Funktionsparametern?
– Johannes DB
20. April 2011 um 0:16 Uhr
mögliches Duplikat von Was ist nützlich an einem Referenz-auf-Array-Parameter?
– Ant
20. April 2011 um 0:25 Uhr