2017-03-07 1 views
-2

Bitte meinen Code-Schnipsel unten finden:Ich habe eine falsche Vorstellung, mit Zeigern in C++

void inpu(vector<vector<int>> &pairs,int I){ 
//Do something 
} 

int main() { 
    int I = 10; 
    vector<vector<int> > pairs(N); 
    inpu(pairs,I); 
} 

Jetzt verstehe ich, dass die Funktion inpu() eine Adresse eines Vektortyp und eine ganze Zahl erwartet. Mein Zweifel ist, dass, wenn inpu() aufrufen, warum übergeben wir nicht eine Adresse des Vektors pairs, wie inpu(&pairs,I); in int main(), aber wie inpu(pairs,I);?

+9

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

+0

& 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

+0

'&' bedeutet sehr unterschiedliche Dinge, wenn sie in einem Typ verwendet werden und wenn sie auf einen Ausdruck als Operator angewendet werden. – molbdnilo

Antwort

1

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.