Передача массива по ссылке - PullRequest
150 голосов
/ 20 апреля 2011

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

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}

Имеет ли (&myArray)[100] какое-либо значение или это просто синтаксис для передачи какого-либо массива по ссылке? Я не понимаю отдельных скобок, за которыми следуют большие скобки. Спасибо.

Ответы [ 4 ]

197 голосов
/ 20 апреля 2011

Это синтаксис для ссылок на массивы - вам нужно использовать (&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

Это анализируется как «массив ссылок», что недопустимо.

42 голосов
/ 20 апреля 2011

Это просто необходимый синтаксис:

void Func(int (&myArray)[100])

^ Передать массив из 100 int, указав имя параметра myArray;

void Func(int* myArray)

^ Передать массив. Массив распадается на указатель. Таким образом, вы теряете информацию о размере.

void Func(int (*myFunc)(double))

^ Передать указатель на функцию. Функция возвращает int и принимает double. Имя параметра myFunc.

20 голосов
/ 20 апреля 2011

Это синтаксис.В аргументах функции необходимы 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

3 голосов
/ 02 июля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...