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

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

void foo(double& *bar) 

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

Спасибо и приветствую.

Массивы могут передаваться только по ссылке:

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

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

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

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

 template void foo(T (&bar)[N]) { // use N here } 

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

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

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

или

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

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

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

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

 void foo(double *bar); 

достаточно.

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

 void foo(double *&bar); 

является правильной формой.

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

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

 void foo(std::vector& bar) {} 

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

Для справки:

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

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

 int * const *x; 

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

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

  • C ++ Можно ли определить, указывает ли указатель на действительный объект?
  • Как сравнить указатели?
  • почему имя массива является указателем на первый элемент массива?
  • У java действительно есть указатели или нет?
  • C - Разница между «char var » и «char * var»?
  • Почему NULL-указатели различаются по-разному на C и C ++?
  • Каковы различия между переменной указателя и ссылочной переменной в C ++?
  • как получить hexdump структурных данных
  • C: указатель на структуру в определении структуры
  • Что происходит в ОС, когда мы разыскиваем указатель NULL в C?
  • Как эта ссылка осуществляется внутри страны?
  • Interesting Posts
    Давайте будем гением компьютера.