Übergeben von Arrays an die Funktion in C ++

73
#include <iostream>
using namespace std;

void printarray (int arg[], int length) {
    for (int n = 0; n < length; n++) {
        cout << arg[n] << " ";
        cout << "\n";
    }
}

int main ()
{
     int firstarray[] = {5, 10, 15};
     int secondarray[] = {2, 4, 6, 8, 10};
     printarray(firstarray, 3);
     printarray(secondarray, 5);

     return 0;
}

Dieser Code funktioniert, aber ich möchte verstehen, wie das Array übergeben wird.

Wenn die printarrayFunktion von der Hauptfunktion aus aufgerufen wird , wird der Name des Arrays übergeben. Der Name des Arrays bezieht sich auf die Adresse des ersten Elements des Arrays. Wie ist das gleichzusetzen int arg[]?

Jay K.
quelle
Um genau zu sein, bezieht sich der Name des Arrays auf das Array. Es kann in einen Zeiger auf das erste Element konvertiert werden, was in den meisten Fällen der Fall ist.
Joseph Mansfield
Ich schlage vor, Knattens Antwort zur akzeptierten zu machen.
Wally

Antworten:

49

Die Syntax

int[]

und

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

sind genau das gleiche wie

int*

wenn in einer Funktionsparameterliste (ich habe die optionalen Namen weggelassen).

Zusätzlich zerfällt ein Array-Name in einen Zeiger auf das erste Element, wenn er an eine Funktion übergeben wird (und nicht als Referenz übergeben wird), so dass beide int firstarray[3]und int secondarray[5]in int*s abfallen .

Es kommt auch vor, dass sowohl eine Array-Dereferenzierung als auch eine Zeiger-Dereferenzierung mit tiefgestellter Syntax (tiefgestellte Syntax ist x[y]) einen l-Wert für dasselbe Element ergeben, wenn Sie denselben Index verwenden.

Diese drei Regeln machen den Code legal und funktionieren so, wie Sie es erwarten. Es werden nur Zeiger an die Funktion übergeben, zusammen mit der Länge der Arrays, die Sie nicht kennen können, nachdem die Arrays in Zeiger zerfallen sind.

Seth Carnegie
quelle
1
OK. Aber wie greifen Sie innerhalb der Funktion auf das Array zu? Wenn Sie sagen, sagen Sie printArray(int* arg). Wie greifen Sie auf arg innerhalb des Funktionskörpers zu?
Ssenyonjo
21

Ich möchte dies nur hinzufügen, wenn Sie auf die Position des Arrays wie zugreifen

arg[n]

ist das gleiche wie

*(arg + n) als bedeutet einen Versatz von n beginnend mit der Adresse de arg.

so arg[0]wird es sein*arg

DGomez
quelle
15

Die Frage wurde bereits beantwortet, aber ich dachte, ich würde eine Antwort mit genauerer Terminologie und Verweisen auf den C ++ - Standard hinzufügen.

Hier laufen zwei Dinge ab: Array-Parameter werden an Zeigerparameter angepasst und Array-Argumente werden in Zeigerargumente konvertiert . Dies sind zwei sehr unterschiedliche Mechanismen, der erste ist eine Anpassung an den tatsächlichen Typ des Parameters, während der andere eine Standardkonvertierung ist, die einen temporären Zeiger auf das erste Element einführt.

Anpassungen an Ihrer Funktionsdeklaration:

dcl.fct # 5 :

Nach dem Bestimmen des Typs jedes Parameters wird jeder Parameter vom Typ "Array von T" (...) so eingestellt, dass er "Zeiger auf T" ist.

Also int arg[]ist angepasst zu sein int* arg.

Konvertierung Ihres Funktionsarguments:

conv.array # 1

Ein l-Wert oder r-Wert vom Typ "Array von NT" oder "Array von unbekannter Grenze von T" kann in einen Wert vom Typ "Zeiger auf T" konvertiert werden. Die temporäre Materialisierungskonvertierung wird angewendet. Das Ergebnis ist ein Zeiger auf das erste Element des Arrays.

In printarray(firstarray, 3);wird der Wert firstarrayvom Typ "Array von 3 int" in einen Wert (temporär) vom Typ "Zeiger auf int" konvertiert, der auf das erste Element zeigt.

kneten
quelle
Wie ordne ich die Werte vom Zeiger dem Array zu, z. B. printArray(int* arr)einem anderen bereits definierten Array, z. B. int myArray[5]innerhalb der printArrayFunktion. Wie kann ich tun myArray = arr?
Ssenyonjo
9

firstarrayund secondarraywerden in einen Zeiger auf int konvertiert, wenn sie an übergeben werden printarray().

printarray(int arg[], ...) ist äquivalent zu printarray(int *arg, ...)

Dies ist jedoch nicht spezifisch für C ++. C hat die gleichen Regeln für die Übergabe von Array-Namen an eine Funktion.

Olaf Dietsche
quelle
-1

Die einfache Antwort ist, dass Arrays IMMER als Referenz übergeben werden und das int arg [] den Compiler einfach wissen lässt, dass ein Array erwartet wird

Bob Warner
quelle