Arrays doorgeven aan functie in C++

Deze code werkt, maar ik wil weten hoe de array wordt doorgegeven.

Als de functie printarraywordt aangeroepen vanuit de hoofdfunctie, wordt de naam van de array doorgegeven. De naam van de array verwijst naar het adres van het eerste element van de array. Hoe komt dit overeen met int arg[]?


Antwoord 1, autoriteit 100%

De syntaxis

int[]

en

int[X] // Where X is a compile-time positive integer

zijn precies hetzelfde als

int*

wanneer in een lijst met functieparameters (ik heb de optionele namen weggelaten).

Bovendien vervalt een arraynaam naar een pointer naar het eerste element wanneer deze wordt doorgegeven aan een functie (en niet wordt doorgegeven door verwijzing), dus zowel int firstarray[3]als int secondarray[5]verval naar int*s.

Het komt ook voor dat zowel een array-dereference als een pointer-dereference met subscriptsyntaxis (subscriptsyntaxis is x[y]) een lwaarde opleveren voor hetzelfde element wanneer u dezelfde index gebruikt.

p>

Deze drie regels zorgen ervoor dat de code legaal is en werkt zoals u verwacht; het geeft alleen pointers door naar de functie, samen met de lengte van de arrays die je niet kunt weten nadat de arrays zijn vervallen tot pointers.


Antwoord 2, autoriteit 40%

Ik wil dit alleen toevoegen, wanneer je de positie van de array opent, zoals

arg[n]

is hetzelfde als

*(arg + n)
dan betekent een offset van n vanaf het arg-adres.

dus arg[0]wordt *arg


Antwoord 3, autoriteit 28%

De vraag is al beantwoord, maar ik dacht dat ik een antwoord zou toevoegen met preciezere terminologie en verwijzingen naar de C++-standaard.

Er zijn hier twee dingen aan de hand: array-parameters worden aangepast naar pointer-parametersen array-argumenten worden geconverteerd naar pointer-argumenten. Dit zijn twee heel verschillende mechanismen, de eerste is een aanpassing aan het eigenlijke type van de parameter, terwijl de andere een standaardconversie is die een tijdelijke verwijzing naar het eerste element introduceert.

Aanpassingen aan uw functiedeclaratie:

dcl.fct#5:

Na het bepalen van het type van elke parameter, wordt elke parameter van het type “array of T” (…) aangepast om “pointer to T” te zijn.

Dus int arg[]wordt aangepast naar int* arg.

Conversie van uw functieargument:

conv.array#1

Een lwaarde of rwaarde van het type “matrix van NT” of “matrix met onbekende grens van T” kan worden geconverteerd naar een prwaarde van het type “pointer naar T”. De tijdelijke materialisatieconversie wordt toegepast. Het resultaat is een verwijzing naar het eerste element van de array.

Dus in printarray(firstarray, 3);wordt de lvalue firstarrayvan het type “array of 3 int” geconverteerd naar een prwaarde (tijdelijk) van het type “pointer to int”, wijzend naar het eerste element.


Antwoord 4, autoriteit 19%

firstarrayen secondarrayworden geconverteerd naar een pointer naar int, wanneer ze worden doorgegeven aan printarray().

printarray(int arg[], ...)is gelijk aan printarray(int *arg, ...)

Dit is echter niet specifiek voor C++. C heeft dezelfde regels voor het doorgeven van arraynamen aan een functie.


Antwoord 5

Het simpele antwoord is dat arrays ALTIJD door verwijzing worden doorgegeven en de int arg[] laat de compiler gewoon weten dat hij een array kan verwachten

Other episodes