Вопрос:

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

c++ arrays pointers reference pass-by-reference

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:03

2 плюса

1312 Репутация автора

Как говорит другой ответ, поставьте &после *.

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

int * const *x;

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

Автор: parkovski Размещён: 04.04.2012 09:07

6 плюса

22796 Репутация автора

Поскольку вы используете C ++, обязательное предложение, которого здесь еще нет, это использовать std::vector<double>.

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

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

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

Для справки:

Автор: moooeeeep Размещён: 04.04.2012 09:12

14 плюса

133469 Репутация автора

Да, но при сопоставлении аргумента для ссылки неявный массив с указателем не является автоматическим, поэтому вам нужно что-то вроде:

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

или же

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

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

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

Автор: James Kanze Размещён: 04.04.2012 09:25

105 плюса

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.

Автор: jrok Размещён: 04.04.2012 09:27

3 плюса

138 Репутация автора

8.3.5.8 Если тип параметра включает в себя тип формы «указатель на массив с неизвестной границей T» или «ссылка на массив с неизвестной границей T», программа является некорректной

Автор: Kirilodius Размещён: 18.07.2014 03:05
Вопросы из категории :
32x32