Weil Sie die Objektadresse (ein Zeiger) nicht übergeben. Sie übergeben das Objekt selbst (über eine Referenz). Ampersand in der Deklaration von Funktionsargument ist die Syntax, um zu unterscheiden, dass Sie das Objekt selbst lieber als eine Kopie möchten.
// This will copy the pairs
void inpu_c(vector<vector<int>> pairs){
}
// This will work on the original object
void inpu_r(vector<vector<int>> &pairs){
}
Der Zeiger kann als Referenztyp verwendet werden, Sie können ihn dereferenzieren und das ursprüngliche Objekt selbst verwenden.
// This will work on the pointer
void inpu_p(vector<vector<int>>* pairs){
pairs->clear();
(*pairs).clear();
// You can even use a reference type inside, you have to dereference a pointer
assert(pairs); //Some protection against invalid pointers
// a reference type requires an object
vector<vector<int>>& r = *pairs;
// will clear object pointer by pairs
r.clear();
}
mit Pass-by-Wert und Pass-by-Kopie Semantik der Client-Syntax nicht jedoch ändern. Der Client-Code sieht gleich aus. Aus diesem Grund müssen Sie den get-address-Operator (&
) nicht auf der Aufrufseite verwenden.
Zeiger unterscheiden sich geringfügig von Referenzen, diese beiden sind unterschiedliche Datentypen. Z.B. Der Zeiger ist nullbar, d. h. er hat einen speziellen ungültigen Wert, während der Verweis so entworfen ist, dass er immer auf ein Objekt zeigt.
Die '& Paare' ** nicht ** bedeutet, dass die Funktion die Adresse eines Vektors erwartet (der als' * Paare' geschrieben würde). Es ist ein [pass-by-reference] (https://www.tutorialspoint.com/cplusplus/cpp_function_call_by_reference.htm) Argument, also heißt es wie gezeigt. – lurker
& Paare ist ein Zeiger. Das kann null sein. 'inpu (... & Paare, ...)' fragt nach einer Referenz. Nicht trivial, um eine Null zu senden. Siehe https://stackoverflow.com/questions/114180/pointer-vs-reference – wigy
'&' bedeutet sehr unterschiedliche Dinge, wenn sie in einem Typ verwendet werden und wenn sie auf einen Ausdruck als Operator angewendet werden. – molbdnilo