#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 printarray
Funktion 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[]
?
Antworten:
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]
undint secondarray[5]
inint*
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.
quelle
printArray(int* arg)
. Wie greifen Sie auf arg innerhalb des Funktionskörpers zu?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
quelle
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 :
Also
int arg[]
ist angepasst zu seinint* arg
.Konvertierung Ihres Funktionsarguments:
conv.array # 1
In
printarray(firstarray, 3);
wird der Wertfirstarray
vom Typ "Array von 3 int" in einen Wert (temporär) vom Typ "Zeiger auf int" konvertiert, der auf das erste Element zeigt.quelle
printArray(int* arr)
einem anderen bereits definierten Array, z. B.int myArray[5]
innerhalb derprintArray
Funktion. Wie kann ich tunmyArray = arr
?firstarray
undsecondarray
werden in einen Zeiger auf int konvertiert, wenn sie an übergeben werdenprintarray()
.printarray(int arg[], ...)
ist äquivalent zuprintarray(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.
quelle
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
quelle