2016-02-24 2 views
5

Массивы могут передаваться как указатель на функцию или даже в качестве ссылки. Передача его в качестве ссылки дает псевдоним, по которому будут работать операторы sizeof и count. Это делает переход по ссылке выше.C++: нормально ли передавать ссылку на массив на функцию

Однако проход по указателю кажется нормой в книгах. Зачем? Есть ли что-то, что мне особенно нужно знать о передаче по ссылке для массивов?

ответ

5

Передача по ссылке означает, что ваша функция может принимать только массивы фиксированного размера (именно поэтому он знает свой размер, потому что компилятор его применяет). Прохождение указателем означает иначе. Кроме того, передача указателем позволяет пройти nullptr, к лучшему или к худшему.

+1

! Не будет ли приниматься динамически выделенный массив в качестве параметра для передачи по ссылке? Как так? Ссылка - это, в конце концов, псевдоним. – quantum231

+0

@ quant231 Динамическое выделение массива уже возвращает указатель, поэтому нет. –

+1

Существует не требование автоматического распределения, но есть проблема с типом. Пример: 'void f (int (& arg) [5]);' 'void g() {f (* new int [1] [5]);}' –

1

Обычно я использую std::vector и хотел бы перейти по ссылке const. Тем не менее, если мой api может в какой-то момент быть вызван c-кодом, использование pass by const-указателя может иметь смысл, хотя вам также необходимо отправить размер. Если функцию можно вызвать с помощью std::array или std::vector, вы можете решить отправить указатель (и размер) или набор итераторов (начало/конец).

Если мы говорим об использовании std :: array, аргумент шаблона требует размера массива. Это означало бы в нормальной функции, вам нужно фиксированный размер:

void myfunc(const std::array<int, 5>& mydata){...} 

Однако, если мы делаем шаблонную функцию, шаблонизации по размеру, что больше не является проблема.

template<unsigned int SZ> 
void myfunc(const std::array<int, SZ>& mydata) {...} 

Если мы говорим о стеке выделяются массивы с стилем ... Хороший C++ стиль предпочесть станд :: массив/зЬй :: вектора для массивов с стилем. Я бы рекомендовал прочитать C++ Coding Standard by Herb Sutter глава 77 на стр. 152 о предмете. При использовании массивов c-стиля отправкой указателя и размера является стандартный способ перехода.

Смежные вопросы