C ++ передать массив по ссылке
124291 просмотра
6 ответа
15361 Репутация автора
это разрешено передавать массив по ссылке?
void foo(double& *bar)
Кажется, мой компилятор говорит нет. Почему? Как правильно передать массив по ссылке? Или работа вокруг? У меня есть аргумент массива, который должен изменить мой метод, и который я должен получить впоследствии. В качестве альтернативы, я мог бы сделать этот массив членом класса, который отлично работает, но у него есть много недостатков для другой части моего кода (чего я хотел бы избежать).
Спасибо и всего наилучшего.
Автор: kiriloff Источник Размещён: 04.04.2012 09:00Ответы (6)
6 плюса
6658 Репутация автора
Если вы хотите изменить только элементы:
void foo(double *bar);
достаточно.
Если вы хотите изменить адрес (например:) realloc
, но он не работает для массивов:
void foo(double *&bar);
это правильная форма.
Автор: Naszta Размещён: 04.04.2012 09:032 плюса
1312 Репутация автора
Как говорит другой ответ, поставьте &
после *
.
Это поднимает интересный момент, который иногда может сбивать с толку: типы должны читаться справа налево. Например, это (начиная с самого правого *
) указатель на постоянный указатель на int.
int * const *x;
Поэтому то, что вы написали, будет указателем на ссылку, что невозможно.
Автор: parkovski Размещён: 04.04.2012 09:076 плюса
22796 Репутация автора
Поскольку вы используете C ++, обязательное предложение, которого здесь еще нет, это использовать std::vector<double>
.
Вы можете легко передать его по ссылке:
void foo(std::vector<double>& bar) {}
И если у вас есть поддержка C ++ 11, посмотрите также std::array
.
Для справки:
Автор: moooeeeep Размещён: 04.04.2012 09:1214 плюса
133469 Репутация автора
Да, но при сопоставлении аргумента для ссылки неявный массив с указателем не является автоматическим, поэтому вам нужно что-то вроде:
void foo( double (&array)[42] );
или же
void foo( double (&array)[] );
Имейте в виду, однако, что при совпадении, double [42]
и double []
это разные типы. Если у вас есть массив неизвестного измерения, он будет соответствовать второму, но не первому, а если у вас есть массив с 42 элементами, он будет соответствовать первому, но не второму . (Последнее, ИМХО, очень нелогично.)
Во втором случае вам также нужно будет передать измерение, поскольку нет способа восстановить его, как только вы окажетесь внутри функции.
Автор: James Kanze Размещён: 04.04.2012 09:25105 плюса
46931 Репутация автора
Массивы могут быть переданы только по ссылке, на самом деле:
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
.
3 плюса
138 Репутация автора
8.3.5.8 Если тип параметра включает в себя тип формы «указатель на массив с неизвестной границей T» или «ссылка на массив с неизвестной границей T», программа является некорректной
Автор: Kirilodius Размещён: 18.07.2014 03:05Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- arrays Как удалить дубликаты из массива C #?
- arrays Как определить размер моего массива в C?
- arrays Каков наилучший способ конвертировать массив в хеш в Ruby
- arrays Сравнение двухбайтовых массивов в .NET
- pointers Как вы передаете функцию в качестве параметра в C?
- pointers Regular cast vs. static_cast vs. dynamic_cast
- pointers Каковы различия между переменной-указателем и ссылочной переменной в C ++?
- reference Есть ли разница между "==" и "есть"?
- reference Определение манифеста обнаруженной сборки не соответствует ссылке на сборку
- reference Есть ли ошибки, использующие varargs с опорными параметрами
- pass-by-reference Передать по ссылке или передать по значению?
- pass-by-reference Является ли Java «передачей по ссылке» или «передачей по значению»?
- pass-by-reference Зачем использовать ключевое слово ref при передаче объекта?
- pass-by-reference В чем разница между передачей по ссылке или передачей по значению?