Übergeben eines Arrays als Referenz

Lesezeit: 6 Minuten

Ubergeben eines Arrays als Referenz
Johannes DB

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

1647069008 115 Ubergeben eines Arrays als Referenz
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];.

EDIT: Etwas Klarstellung.

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

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

1647069008 736 Ubergeben eines Arrays als Referenz
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

Ubergeben eines Arrays als Referenz
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:

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

spiele mit dem Code.

1647069010 914 Ubergeben eines Arrays als Referenz
Eduardo A. Fernández Díaz

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


992990cookie-checkÜbergeben eines Arrays als Referenz

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy