2013-05-30 197 views
2

爲什麼在下列代碼中的類型名稱(T*&)之後應該使用*&?是不是a指針指針?如果是這樣,那麼爲什麼我不應該使用**呢?將數組指針傳遞給函數

template <class T> void CreateArray(T*& a, int n) 
{ 
    a = new double[n]; 
} 

int main() 
{ 
    double* a; 
    CreateArray<double>(a,3); 
    return 0; 
} 
+3

它是*指針*指針 –

+4

不,它是對指針的引用。 –

+0

你同意Oli嗎?你似乎在問一個引用如何比指針有不同的行爲。 –

回答

5

是不是一個指針的指針?

不,它是對指針的引用。

那麼爲什麼我不應該用**代替?

你可以做到這一點,但它使調用方和函數內的用法稍微複雜一些。但是,您可以用任何方式編寫一個具有相同整體效果的函數。

+1

引用也更安全,指針只是一個存儲地址的變量,並且該地址不一定是內存中有效且可讀的位置,它也可以是您不想查找的內容。 – user2384250

+4

@ user2384250:在實踐中,不能保證引用是指有效的對象... –

+1

@OliCharlesworth,我們離開了對程序員的「良好實踐」,是不是? – user2384250

2

T*&是對指針的引用,現在雖然後臺引用可能會作爲指針實現,但它與T**不同。你絕對可以使用T **來完成同樣的事情,但它不會是慣用的C++,它不會那麼簡單,使用引用可以讓你不用擔心如何通過引用傳遞。

+0

要添加Shafik的優秀總結,雖然通過引用傳遞指針似乎不是什麼大問題,但傳遞對任意類的引用允許您使用更簡單的語法和語義,並提供更安全,更簡單且更易維護的方法將參數用作輸出參數。愛的引用,擁抱他們,儘可能地用它們代替指針。 –

+0

如何使用'T **'更少慣用或不那麼簡單(不考慮少數多餘的字符)。我可以在'T *&'這裏定義'T **'的情況,因爲前者讓調用者明確函數可能修改指針,而不能區分'T *&'和' T *'在查看調用代碼時的參數。當然,代碼無論如何都是很糟糕的,但這實際上並不重要。 – Grizzly