2013-05-30 4 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

Согласны ли вы с Оли? Похоже, вы спрашиваете, как ссылка действует иначе, чем указатель. –

ответ

5

Не является указателем на указатель?

Нет, это ссылка на указатель.

то почему я не должен использовать ** вместо этого?

Вы можете сделать это, но это делает использование как на стороне вызова, так и внутри функции немного сложнее. Однако вы можете написать функцию с таким же общим эффектом в любом случае.

+1

ссылки также более безопасны, указатель - это просто переменная, которая хранит адрес, и этот адрес не обязательно является допустимым, читаемым, местоположением в памяти, он также может быть тем, что вы НЕ ищете. – user2384250

+4

@ user2384250: На практике нет гарантии, что ссылка ссылается на действительный объект либо ... –

+1

@OliCharlesworth хорошо, мы оставляем «хорошую практику» программисту, не так ли? – user2384250

2

T*& является ссылкой на указатель, теперь, когда ссылки за кулисами могут быть реализованы как указатель, это не то же самое, что T**. Вы можете определенно использовать T **, чтобы выполнить ту же самую вещь, но это не было бы идиоматическим C++, и это было бы не так просто, используя ссылки, вы можете не беспокоиться о том, как пройти по ссылке.

+0

Чтобы добавить к превосходному суммированию Shafik, в то время как передача указателя по ссылке не кажется большой проблемой, передача ссылки на произвольный класс позволяет использовать более простой синтаксис и семантику и представляет более безопасный, простой и удобный способ использовать аргументы в качестве выходных параметров. Любите ссылки, обнимайте их, используйте их вместо указателей, когда сможете. –

+0

Как бы использование 'T **' было менее идиоматичным или менее простым (без учета нескольких дополнительных символов). Я могу определенно увидеть случай для 'T **' над 'T * &' здесь, поскольку первый делает его явным для вызывающего, что функция может изменить указатель, в то время как вы не можете отличить 'T * &' и ' T * 'при просмотре вызывающего кода. Конечно, код ужасен в любом случае, но это действительно не так. – Grizzly