2017-03-07 71 views
-2

請找我的代碼 - 摘錄如下指針一種誤解:我有在C++

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

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

現在,據我所知,功能inpu()需要一個載體類型和一個整數的地址。我的疑問是,當撥打inpu()時,爲什麼我們不通過向量pairs的地址,因爲inpu(&pairs,I);int main(),而是作爲inpu(pairs,I);

+9

'&pairs' **不代表函數需要一個向量的地址(可以寫成'* pairs')。這是一個[通過引用傳遞](https://www.tutorialspoint.com/cplusplus/cpp_function_call_by_reference.htm)參數,因此如圖所示調用它。 – lurker

+0

&對是一個指針。這可以爲null。 'inpu(...&pair,...)'請求參考。發送空值不是微不足道的。請參閱https://stackoverflow.com/questions/114180/pointer-vs-reference – wigy

+0

'&'在類型中使用時和在作爲運算符應用於表達式時意味着完全不同的東西。 – molbdnilo

回答

1

因爲你不傳遞對象的地址(一個指針)。你傳遞對象本身(通過引用)。函數參數聲明中的&符號是用於區分您希望對象本身而不是副本的語法。

// 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){ 
} 

指針可以用作引用類型,您可以取消引用它並使用原始對象本身。

// 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(); 
} 

儘管使用按值傳遞和傳遞通過語義並不改變客戶端語法。客戶端代碼看起來一樣。這就是爲什麼您不必在呼叫站點上使用獲取地址運營商(&)。

指針與引用略有不同,這兩個是不同的數據類型。例如。指針是可空的,即有一個特殊的指定的無效值,而引用被設計爲始終指向一個對象。