Передача массива по ссылке
Как работает передача статически выделенного массива по ссылке?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
Есть ли (&myArray)[100]
имеет какое-либо значение или это просто синтаксис для передачи любого массива по ссылке? Я не понимаю отдельных скобок, за которыми следуют большие скобки. Благодарю.
4 ответа
Это синтаксис для ссылок на массивы - вам нужно использовать (&array)
уточнить компилятору, что вы хотите ссылку на массив, а не (недействительный) массив ссылок int & array[100];
,
РЕДАКТИРОВАТЬ: некоторые уточнения.
void foo(int * x);
void foo(int x[100]);
void foo(int x[]);
Эти три разных способа объявления одной и той же функции. Все они рассматриваются как прием int *
параметр, вы можете передать им массив любого размера.
void foo(int (&x)[100]);
Это принимает только массивы из 100 целых чисел. Вы можете безопасно использовать sizeof
на x
void foo(int & x[100]); // error
Это анализируется как "массив ссылок" - что не является законным.
Это просто необходимый синтаксис:
void Func(int (&myArray)[100])
^ Пройти массив 100 int
по ссылке имя параметра myArray
;
void Func(int* myArray)
^ Передайте массив. Массив распадается на указатель. Таким образом вы теряете информацию о размере.
void Func(int (*myFunc)(double))
^ Передать указатель на функцию. Функция возвращает int
и берет double
, Имя параметра myFunc
,
Это синтаксис. В аргументах функции int (&myArray)[100]
скобки, которые заключают в себе &myArray
необходимы. если вы не используете их, вы будете передавать array of references
и это потому, что subscript operator []
имеет более высокий приоритет над & operator
,
Например int &myArray[100] // array of references
Итак, используя type construction ()
вы говорите компилятору, что вы хотите ссылку на массив из 100 целых чисел.
Например int (&myArray)[100] // reference of an array of 100 ints
Следующее создает общую функцию, принимающую по ссылке массив любого размера и любого типа:
template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
// do stuff
}
Массивы по умолчанию передаются указателями. Вы можете попробовать изменить массив внутри вызова функции для лучшего понимания.