Передача массива по ссылке

Как работает передача статически выделенного массива по ссылке?

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
}

поиграйте с кодом.

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

Другие вопросы по тегам