Как передать массив по ссылке c

Эта запись означает передачу ссылки на начало массива, или на весь массив, как параметр?
Или нужно обязательно указывать [size] массива?
Или, как вообще можно корректно передать массив в функцию так, чтобы в нём отразились все изменения?

1 ответ 1

Достаточно просто использовать указатель:

То же самое можно записать в виде void ShowData(int arr[], int size); и void ShowData(int arr[N], int size); , но результат будет абсолютно такой же: arr будет указателем на int .

Если длина массива известна во время компиляции, тогда можно передавать именно ссылку на массив:

Где N – константа времени компиляции. Как вариант, можно сделать N параметром шаблона:

Обратите внимание: Если вы выделяли память динамически, и у вас есть не сам массив, а указатель на него, тогда чтобы передать его в int(&arr)[N] потребуется reinterpret_cast .

Причудливая конструкция, которую вы написали:

Дает тот же эффект*, что передача указателя, только интерфейс менее удобный: чтобы передать массив в такую функцию, придется использовать reinterpret_cast (массив) .

Эта запись означает передачу ссылки на начало массива, или на весь массив, как параметр?

Я так понимаю, ни то, ни другое.

Это ссылка на тип int[] , но т.к. он считается incomplete type, переменные в принципе не могут иметь такой тип (в отличие от int[N] ). Можно сказать, что вы передаете ссылку на несуществующий int[] с тем же адресом, что и ваш массив.

* Хотя возможно, что доступ к такому параметру приводит к нарушению strict aliasing (типы ведь отличаются) и неопределенному поведению, но нужно проверять стандарт.

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

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

Читайте также:  Почему не печатаются номера страниц

РЕДАКТИРОВАТЬ: Некоторые разъяснения.

Эти три являются разными способами объявления одной и той же функции. Все они рассматриваются как принимающие параметр int * , вы можете передать им любой массив размеров.

Это принимает только массивы из 100 целых чисел. Вы можете безопасно использовать sizeof на x

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

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

^ Передайте массив из 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

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

Посмотрите другие вопросы по меткам c++ arrays или Задайте вопрос

Предоставляется функциям void main () и void hello (byte * a [4]). Основная функция имеет массив из четырех байтов. Ссылка на массив должна быть передана функции hello для манипуляции. Я ожидаю, что правильный синтаксис будет:

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

Это правильный способ сделать это?

Решение

Здесь есть много разных вариантов в зависимости от того, что вы хотите сделать здесь.

Читайте также:  Статические и нестатические методы java

Если у вас есть необработанный массив byte объекты, вы можете передать его в функцию, как это:

Механизм, посредством которого массив передается в функцию (указатель на первый элемент массива передается функции), работает аналогично передаче по ссылке: любые изменения, которые вы вносите в arr в hello будет придерживаться main даже если вы явно не указали ссылку на него. Тем не менее hello Функция не будет проверять, имеет ли массив размер четыре или нет — она ​​будет принимать в качестве входных данных массив любой количество байтов.

Вы также можете написать

Синтаксис byte (&arr)[4] означает «ссылка на массив из четырех байтов». Это явно передает массив по ссылке в hello и проверит размер массива, чтобы убедиться, что он правильный. Тем не менее, это очень необычный синтаксис и редко встречается на практике.

Но, пожалуй, лучшая идея не использовать сырые массивы и использовать std::array вместо:

Теперь нет ничего странного в странных скобках в синтаксисе для массивов байтов, и нет проблем с проверкой размера. Все обрабатывается правильно, потому что std::array это тип объекта, который имеет все преимущества обычных типов объектов. Я бы рекомендовал использовать этот последний подход выше всех остальных.

Другие решения

byte* a[4] массив из четырех указателей на byte кроме как в списке параметров.
В списке параметров это указатель на указатель на byte — то есть это эквивалентно byte** ,

byte (*a)[4] указатель на массив из четырех элементов

byte (&a)[4] является ссылкой на массив из четырех элементов.

В твоем случае, &stuff указатель на массив из четырех элементов, поэтому ваш параметр должен быть byte (*a)[4] ,

Массивы уже передаются по указателю.

Читайте также:  Что делать если взломали электронную почту

Это то же самое, что делать это:

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector