C ++ передать массив по ссылке

это разрешено передавать массив по ссылке?

<code> void foo(double& *bar) 
</code>

Кажется, мой компилятор говорит нет. Зачем? Как правильно передать массив по ссылке? Или работа вокруг? У меня есть аргумент массива, который должен изменить мой метод, и который я должен получить впоследствии. В качестве альтернативы, я мог бы сделать этот массив членом класса, который отлично работает, но у него есть много недостатков для другой части моего кода (чего я хотел бы избежать).

Спасибо и всего наилучшего.

 Some programmer dude04 апр. 2012 г., 11:03
Проверитьclockwise spiral rule.
 RedX04 апр. 2012 г., 11:02
Какой это компилятор?
 underscore_d11 дек. 2018 г., 12:52
@moooeeeepstd::vector очевидно, лучше, если размер является динамическим / неизвестным, но в случаях, когда размер всегда один и тот же, это будет излишним, и вместо этогоstd::array разрешает синтаксическое безобразие, а также присваивает семантику значения.
 moooeeeep04 апр. 2012 г., 11:06
Вы рассматривали возможность использованияstd::vector или похожие?

Ответы на вопрос(6)

Если вы хотите изменить только элементы:

void foo(double *bar);

достаточно.

Если вы хотите изменить адрес на (например:realloc), но он не работает для массивов:

void foo(double *&bar);

это правильная форма.

 04 апр. 2012 г., 11:28
За исключением того, что вы не можете передать массив последнему. Он спрашивал о массивах, а не указателях.
 04 апр. 2012 г., 11:41
Второй случай не будет работать для массивов. Это будет работать только если у вас есть фактическая переменная типа указателя.
 04 апр. 2012 г., 11:30
@JamesKanze: правда. Второй случай не будет работать с массивами в стеке, в этом случае он должен использовать первую форму.

8..5.8 Если тип параметра включает в себя тип формы & # x201C; указатель на массив неизвестной границы T & # x201D; или & # x201C; ссылка на массив неизвестных границ T, & # x201D; программа плохо сформирована

Решение Вопроса

void foo(double (&bar)[10])
{
}

Это мешает вам делать такие вещи, как:

double arr[20];
foo(arr); // won't compile

Чтобы можно было передать массив произвольного размераfoo, сделайте его шаблоном и запишите размер массива во время компиляции:

template<typename T, size_t N>
void foo(T (&bar)[N])
{
    // use N here
}

Вы должны серьезно рассмотреть вопрос об использованииstd::vectorили если у вас есть компилятор, который поддерживает c ++ 11,std::array.

 04 апр. 2012 г., 11:40
"Тем не менее, однажды перешел кfooмассив распадается на указатель & quot ;. Нет, это не так, и, поскольку вы можете передавать только массив из 10 элементов, вам не нужна дополнительная информация о размере. (И снова тыcannot передать массивvoid foo( double*& ); Результаты неявного преобразования являются r-значением и не могут использоваться для инициализации ссылки на неконстантное. Вы должны использоватьvoid foo( double *const & );.
 14 авг. 2017 г., 04:52
Если такая функция уже существует, и все, что у вас есть, этоstd::vector (правильного размера), как бы вы бросили содержимое вектора (возможно, получено черезstd::vector::data()) к этому типу массива? Каков синтаксис для фиксированного размера массива в параметре типа (то есть для использования сstatic_cast<>)?
 11 дек. 2018 г., 12:47
@meowsqueak Вы бы этого не сделали, потому что приведение будет иметь неопределенное поведение, AFAICT; Я не вижу никакого пособия вreinterpret_cast для обработки динамически распределяемого массива (без внутреннего размера после выделения) как автоматического с фиксированным размером. Кроме того, это неправильный вопрос: правильный вопрос будет таким: «Как я могу реорганизовать свой код для работы с обоими типами контейнеров?», И ответ - шаблоны и итераторы / диапазоны, или, поскольку вы сказали, что размер исправлена, функция, которая принимает только указатель / ref данных и жестко кодирует размер (или, если размер может варьироваться, адаптер данных / размера, такой какspan)
 05 нояб. 2015 г., 12:23
отлично :) это именно то, что я ищу. я делалvoid foo(T &bar[N]) в моем шаблоне - но на самом деле это означает «массив ссылок» а не "ссылка на массив".

обязательным предложением, которое здесь по-прежнему отсутствует, является использованиеstd::vector<double>.

Вы можете легко передать его по ссылке:

void foo(std::vector<double>& bar) {}

И если у вас есть поддержка C ++ 11, посмотрите такжеstd::array.

Для справки:

http://de.cppreference.com/w/cpp/container/vector http://de.cppreference.com/w/cpp/container/array
 04 апр. 2012 г., 11:28
:-) Да.std::vector обычно лучшее решение. Но есть и исключения.
 04 апр. 2012 г., 11:31
Да. :) +1 заstd::vector

& после*.

Это поднимает интересный момент, который иногда может сбивать с толку: типы должны читаться справа налево. Например, это (начиная с самого правого*) указатель на постоянный указатель на int.

int * const *x;

Поэтому то, что вы написали, будет указателем на ссылку, что невозможно.

 04 апр. 2012 г., 11:29
Изменение порядка все еще не позволяет ему передавать массив. Это требует фактического объекта указателя, а не результатов преобразования.

Указатель не является автоматическим, поэтому вам нужно что-то вроде:

void foo( double (&array)[42] );

или же

void foo( double (&array)[] );

Имейте в виду, однако, что при сопоставлении,double [42] а такжеdouble [] являются различные типы. Если у вас есть массив неизвестного измерения, он будет соответствует второму, но не первому, и если у вас есть массив с 42 элементы, это будет соответствовать первомуbut not the second, (Последнее, ИМХО, очень нелогично.)

Во втором случае вам также придется пройти измерение, так как нет способа восстановить его, когда вы находитесь внутри функции.

 19 мая 2014 г., 10:24
@ Ricky65 Так и есть. Интересно, почему. Ссылки на неполные типы обычно допускаются в качестве параметров функции. (Конечно, в этом случае тип изменяется по завершении:double [] а такжеdouble [42] два разных типа. Поэтому единственной вещью, которую вы могли бы передать в последнюю форму, был бы массив неизвестной длины, напримерextern double d[];или что-то подобное. Что серьезно ограничивает удобство использования.)
 04 апр. 2012 г., 11:29
Вторая не компилируется для меня.
 04 апр. 2012 г., 11:37
Для меня тоже. Я не знаю, произошло ли это из-за ошибки компилятора или чего-то в стандартном, который я пропустил. Я никогда не хотел этого делать. (Первое очень полезно, если измерение является параметром шаблона, так как компилятор определит для вас правильное измерение.)
 18 мая 2014 г., 14:13
Я не верю, что вторым примером является действующий стандарт, соответствующий C ++. Между прочим, он не компилируется с GCC 4.8 или Clang 3.4. Я думаю, что необходим шаблонный размер.

Ваш ответ на вопрос