Как работает передача статически размещенного массива по ссылке?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
Имеет ли (&myArray)[100]
какой-либо смысл или это просто синтаксис для передачи любого массива по ссылке? Я не понимаю отдельных скобок, за которыми следуют большие скобки. Спасибо.
Ответы:
Это синтаксис для ссылок на массивы - вам нужно использовать,
(&array)
чтобы уточнить компилятору, что вы хотите ссылаться на массив, а не на (недопустимый) массив ссылокint & array[100];
.РЕДАКТИРОВАТЬ: некоторые уточнения.
Эти три разных способа объявления одной и той же функции. Все они рассматриваются как принимающие
int *
параметр, вы можете передать им массив любого размера.Это принимает только массивы из 100 целых чисел. Вы можете безопасно использовать
sizeof
наx
Это анализируется как «массив ссылок» - что не является законным.
источник
int a, b, c; int arr[3] = {a, b, c};
?void foo(int & x[100]);
анализируется как "массив ссылок", пожалуйста? Это потому, что правило "справа налево"? Если да, кажется, что это не соответствует тому, какvoid foo(int (&x)[100]);
анализируется как «ссылка на массив». Заранее спасибо.Это просто необходимый синтаксис:
^ Передать массив из 100
int
по ссылке имя параметраmyArray
;^ Передайте массив. Массив распадается на указатель. Таким образом вы теряете информацию о размере.
^ Передать указатель на функцию. Функция возвращает
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
источник
array of references
» - что, конечно, не может существовать, поэтому вы получите ошибку компиляции. Мне забавно, что правила приоритета операторов настаивают, что это должно произойти по умолчанию в любом случае.Массивы по умолчанию передаются указателями. Вы можете попробовать изменить массив внутри вызова функции для лучшего понимания.
источник
char arr[1]; foo(char arr[]).
arr ухудшает указатель; при использованииchar arr[1]; foo(char (&arr)[1])
arr передается как ссылка. Примечательно, что первая форма часто рассматривается как плохо сформированная, так как измерение потеряно.foo(T* t)
и у вас есть массив,T a[N];
тогда, когда вы пишете,foo(a);
я думаю, было бы правильнее сказать, что вы передаете указатель, а не массив, и вы передаете указатель по значению.Следующее создает обобщенную функцию, принимая массив любого размера и любого типа по ссылке:
играть с кодом.
источник