Как зная длину массива определить размер шага

от admin

Как зная длину массива определить размер шага

Массив представляет набор однотипных данных. Формальное определение массива выглядит следующим образом:

После типа переменной идет название массива, а затем в квадратных скобках его размер. Например, определим массив из 4 чисел:

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

Некоторые компиляторы (например, G++) также поддерживают установку размера с помощью переменных.

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

В данном случае фигурные скобки пусты, поэтому все элементы массива получают нулевые значения.

Также мы можем указать конкретные значения для всех элементов массива:

В данном случае в памяти выделяется некоторая область из четырех ячеек по 4 байта (размер типа int), где каждая ячейка содержит определенный элемент массива:

Если значений в инициализаторе меньше, чем элементов в массиве, то значения передаются первым элементам, а остальные получают нулевые значения:

Если значений в инициализаторе больше, чем элементов в массиве, то при компиляции возникнет ошибка:

Здесь массив имеет размер 4, однако ему передается 6 значений.

Если размер массива не указан явно, то он выводится из количества переданных значений:

В данном случае в массиве есть 6 элементов.

При этом не допускается присвоение одному массиву другого массива:

Индексы. Получение и изменение элементов массива

После определения массива мы можем обратиться к его отдельным элементам по индексу. Индексы начинаются с нуля, поэтому для обращения к первому элементу необходимо использовать индекс 0. Обратившись к элементу по индексу, мы можем получить его значение, либо изменить его. Например, получим второй элемент (индекс 1):

Изменение значения второго элемента:

Например, получим и изменим значения элементов:

При обращении по индексу следует учитывать, что мы не можем обратиться по несуществующему индексу. Так, если в массиве 4 элемента, то мы можем использовать индексы с 0 до 3 для обращения к его элементам. Использование любого другого индекса приведет к ошибке:

Константные массивы

Если необходимо, чтобы нельзя было изменять значения элементов массива, то такой массив можно определить как константный с помощью ключевого слова const

Длина массива

Длина массива не всегда бывает известна. Однако может потребоваться получить ее. Для этого можно использовать несколько способов. Первый способ, который пришел из языка С, представляет применение оператора sizeof :

По сути длина массива равна совокупной длине его элементов. Все элементы представляют один и тот же тип и занимают один и тот же размер в памяти. Поэтому с помощью выражения sizeof(numbers) находим длину всего массива в байтах, а с помощью выражения sizeof(numbers[0]) — длину одного элемента в байтах. Разделив два значения, можно получить количество элементов в массиве.

Второй способ представляет применение встроенной библиотечной функции std::size() :

Перебор массивов

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

Чтобы пройтись по массиву в цикле, надо знать его длину. Здесь длина задана константой n.вначале надо найти длину массива. И в цикле for перебираем все элементы, пока счетчик i не станет равным длине массива. В итоге на консоль будут выведены все элементы массива:

Другой пример — вычислим сумму элементов массива:

Здесь длина массива вычисляется динамически — с помощью функции std::size() .

Перебор элементов в стиле for-each

Используем другую форму цикла for , которая предназначена специально для перебора последовательностей, в том числе для массивов

При переборе массива каждый перебираемый элемент будет помещаться в переменную number, значение которой в цикле выводится на консоль.

Если нам неизвестен тип объектов в массиве, то мы можем использовать спецификатор auto для определения типа:

Ввод значений массива с консоли

Подобно тому, как вводятся данные для отдельных переменных, можно вводить значения для отдельных элементов массива. Например, пусть пользователь вводит значения числового массива:

Здесь в цикле сначала вводятся шесть чисел для каждого элемента массива, затем выводим этот массив.

Как зная длину массива определить размер шага

то есть, количество элементов, которые может содержать массив?

21 ответов

определить размер массива в байтах, вы можете использовать sizeof оператор:

на моем компьютере ints имеют длину 4 байта, поэтому n-68.

определить количество элементов в массиве, мы можем разделить общий размер массива по размеру элемента массива. Вы можете сделать это с типом, например:

и получаем правильный ответ (68 / 4 = 17), но если тип из a изменено у вас будет неприятная ошибка, если вы забыли изменить the sizeof(int) как хорошо.

так что выбранный делитель sizeof(a[0]) , размер zeroeth элемент массива.

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

на sizeof путь это правильный путь iff вы имеете дело с массивами не получили в качестве параметров. Массив, отправленный в качестве параметра функции, рассматривается как указатель, поэтому sizeof вернет размер указателя, а не массива.

таким образом, внутри функции этот метод не работает. Вместо этого всегда передавайте дополнительный параметр size_t size указание количества элементов в матрица.

стоит отметить, что sizeof не помогает при работе со значением массива, которое распалось на указатель: хотя оно указывает на начало массива, для компилятора это то же самое, что указатель на один элемент этого массива. Указатель не «помнит» ничего другого о массиве, который использовался для его инициализации.

размер «трюк» — лучший способ, который я знаю, с одним небольшим, но (для меня, это главное домашнее животное) важным изменением в использовании скобок.

как показывает запись Википедии, C’s sizeof не является функцией; это оператор. Таким образом, он не требует скобок вокруг своего аргумента, если аргумент не является именем типа. Это легко запомнить, так как это делает аргумент похожим на выражение cast, которое также использует скобка.

Итак: если у вас есть следующие:

вы можете найти количество элементов с таким кодом:

это, для меня, читается намного проще, чем альтернатива с круглыми скобками. Я также предпочитаю использовать звездочку в правой части раздела, поскольку она более лаконична, чем индексация.

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

всегда лучше использовать sizeof на фактическом объекте, когда у вас есть один, а не на типе, так как тогда вам не нужно беспокоиться о том, чтобы сделать ошибку и указать неправильный тип.

например, скажем, у вас есть функция, которая выводит некоторые данные в виде потока байтов, например по сети. Назовем функцию send() , и сделать его в качестве аргументов указатель на объект для отправки и количество байтов в объект. Итак, прототипом становится:

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

теперь вы ввели тонкий способ выстрелить себе в ногу, указав тип foo в двух местах. Если одно меняется, а другое нет, код ломается. Таким образом, всегда делайте это так:

теперь вы защищены. Конечно, вы дублируете имя переменной, но это имеет высокую вероятность нарушение таким образом, что компилятор может обнаружить, если вы измените его.

Как зная длину массива определить размер шага

Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.

Рис. 1 Массив хранит адрес первого элемента. Индекс i элемента — это сдвиг на i*sizeof(тип) байт от начала

Как зная длину массива определить размер шага

Массив представляет набор однотипных данных. Формальное определение массива выглядит следующим образом:

После типа переменной идет название массива, а затем в квадратных скобках его размер. Например, определим массив из 4 чисел:

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

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

Здесь массив имеет размер 4, однако ему передается 6 значений.

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

В данном случае в массиве есть 6 элементов.

Свои особенности имеет инициализация символьных массивов. Мы можем передать символьному массиву как набор инициализаторов, так и строку:

Причем во втором случае массив s2 будет иметь не 5 элементов, а 6, поскольку при инициализации строкой в символьный массив автоматически добавляется нулевой символ ‘\0’.

При этом не допускается присвоение одному массиву другого массива:

После определения массива мы можем обратиться к его отдельным элементам по индексу. Индексы начинаются с нуля, поэтому для обращения к первому элементу необходимо использовать индекс 0. Обратившись к элементу по индексу, мы можем получить его значение, либо изменить его:

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

Перебор массивов

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

Чтобы пройтись по массиву в цикле, вначале надо найти длину массива. Для нахождения длины применяется оператор sizeof . По сути длина массива равна совокупной длине его элементов. Все элементы представляют один и тот же тип и занимают один и тот же размер в памяти. Поэтому с помощью выражения sizeof(numbers) находим длину всего массива в байтах, а с помощью выражения sizeof(numbers[0]) — длину одного элемента в байтах. Разделив два значения, можно получить количество элементов в массиве. А далее с помощью цикла for перебираем все элементы, пока счетчик i не станет равным длине массива. В итоге на консоль будут выведены все элементы массива:

Читать:
Почему коннект менеджер не подключается к интернету на виндовс 10

Но также есть и еще одна форма цикла for , которая предназначена специально для работа с коллекциями, в том числе с массивами. Эта форма имеет следующее формальное определение:

Используем эту форму для перебора массива:

При переборе массива каждый перебираемый элемент будет помещаться в переменную number, значение которой в цикле выводится на консоль.

Если нам неизвестен тип объектов в массиве, то мы можем использовать спецификатор auto для определения типа:

Многомерные массивы

Кроме одномерных массивов в C++ есть многомерные. Элементы таких массивов сами в свою очередь являются массивами, в которых также элементы могут быть массивами. Например, определим двухмерный массив чисел:

Такой массив состоит из трех элементов, при этом каждый элемент представляет массив из двух элементов. Инициализируем подобный массив:

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

1 2
4 5
7 8

Также при инициализации можно опускать фигурные скобки:

Возможна также инициализация не всех элементов, а только некоторых:

И чтобы обратиться к элементам вложенного массива, потребуется два индекса:

Переберем двухмерный массив:

Также для перебора элементов многомерного массива можно использовать другую форму цикла for:

Для перебора массивов, которые входят в массив, применяются ссылки. То есть во внешнем цикле for(auto &subnumbers : numbers) &subnumbers представляет ссылку на подмассив в массиве. Во внутреннем цикле for(int number : subnumbers) из каждого подмассива в subnumbers получаем отдельные его элементы в переменную number и выводим ее значение на консоль.

Как зная длину массива определить размер шага

Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет

ar=new int[size]; //Выделение памяти
memset(ar,0,size); //Инициализация
size = sizeof(ar); // выдает 4

Похоже, что размер динамического массива узнать в C++, (у меня Borland C++) невозможно, и надо каждый раз передавать его размер как параметр. Это так?
Спасибо

Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50

Цитата
невозможно
Код
strlen(size);

Добавлено через 34 секунды
В других случаях надо передавать размер массива.

Добавлено через 1 минуту и 5 секунд

Цитата
Код
size = sizeof(ar); // выдает 4

Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69

Цитата(TheDestroyer @ 2.4.2009, 13:04 )
и надо каждый раз передавать его размер как параметр

один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца.
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы.

Это сообщение отредактировал(а) zim22 — 2.4.2009, 13:20

Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41

Цитата
size = sizeof(ar);
Код
int *ar; // указатель на элемент массива
int size=100;
ar=new int[size]; //Выделение памяти
memset(ar,0,size); //Инициализация
int size1=sizeof(int)*size;
delete[] ar;

Это сообщение отредактировал(а) Dmi3ev — 2.4.2009, 13:14

Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50

заверни свои данные в структуру и передавай ее в функцию

Это сообщение отредактировал(а) Alca — 2.4.2009, 13:22

Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69

Цитата(Dmi3ev @ 2.4.2009, 13:14 )
int size1=sizeof(int)*size;
Код
int size1=sizeof(size)*size;

Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250

Цитата(zim22 @ 2.4.2009, 12:14 )
один из способов избежать передачи размера в качестве отдельного параметра заключается в передачи пары итераторов на начало массива и на элемент после его конца.
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы.

Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211

Цитата
ещё один способ: последний элемент массива инициализировать значением-флагом, при достижении которого вы завершите итерировать его элементы.
Код
template <class T>
T* newArray(size_t count)

что-то вроде этого

Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306

Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306

Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211

по любому у этих методов полно недостатков, лучше передавать..либо в структуре, либо просто так..без разницы

Добавлено через 2 минуты и 3 секунды
а еще лучше — как сказали
mrbrooks,
mes используй вектор

Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59

Цитата(mes @ 2.4.2009, 13:37 )
еще один : использовать std::vector и отградить себя от рутинной работы по контролю за динамическим массивом.

Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69

Цитата(TheDestroyer @ 2.4.2009, 13:04 )
Возможно ли узнать размер динамического массива?
Код
template <typename T, size_t size>
size_t get_size(const T (&arr)[size])
int _tmain(int argc, _TCHAR* argv[])

Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.10.2008
Где: Україна

Репутация: 2
Всего: 2

Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41

Цитата
Т.к. если вы вдруг измените тип переменной size, то размер будет считаться неправильно.
Код
ar=new int[size];
Цитата
int size1=sizeof(size)*size;

ненадежно!
потому как, size — это количество элементов, и эта переменная будет неизменна, независимо от того какого типа будет массив и тд.

zim22, ты в этот раз не прав.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »

[ Время генерации скрипта: 0.1582 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Как определить длину массива в C++

По сути, когда мы говорим о длине массива, мы имеем в виду общее количество элементов, присутствующих в соответствующем массиве. Например, посмотрите на массив ниже:

Размер (или длина) массива равна общему количеству элементов в нем. Следовательно, в данном случае это «5».

Способы определения длины массива в C++

Теперь давайте посмотрим на различные способы, с помощью которых мы можем выяснить длину массива в C++:

  • поэлементный подсчет,
  • begin() и end(),
  • функция sizeof(),
  • функция size() в STL,
  • указатели.

Теперь давайте обсудим каждый метод подробно и с примерами.

1: Поэлементный подсчет

Самый очевидный способ – перебрать заданный массив и одновременно подсчитать общее количество перебранных элементов.

Но если мы заранее не знаем длину массива для итерации, то в таком случае мы не можем использовать цикл for. Эту проблему можно решить, используя простой цикл for-each. Внимательно посмотрите на приведенный ниже код.

Вы получите такой результат:

Как мы говорили выше, здесь мы перебираем весь массив arr, используя цикл for-each с итератором i. Значение счетчика c увеличивается по мере итерации. Когда перебор закончится, в c вы найдете длину данного массива.

2: Функции begin() и end()

Мы также можем вычислить длину массива, используя стандартные функции begin() и end(). Эти две функции возвращают итераторы, указывающие на начало и конец массива соответственно. Внимательно посмотрите на данный код:

Следовательно, разница между возвращаемыми значениями двух функций end() и begin() дает нам размер или длину данного массива. Данный код вернет:

3: Функция sizeof()

Оператор sizeof() в C++ возвращает размер переданной переменной или данных в байтах. Кроме того, он возвращает общее количество байтов, необходимых для хранения массива. Следовательно, если мы просто разделим размер массива на размер, занимаемый каждым его элементом, мы узнаем общее количество элементов, присутствующих в массиве.

Давайте посмотрим, как это работает:

В результате мы получим:

4: Функция size() в STL

В стандартной библиотеке есть функция size(), которая возвращает количество элементов в заданном контейнере (в нашем случае это массив).

В результате вы получите:

5: Определение длины массива с помощью указателей

Узнать длину массива можно с помощью указателей. Давайте посмотрим, как это делается:

В результате мы получим:

Выражение *(arr+1) выдает адрес области памяти сразу после последнего элемента массива. Следовательно, разница между ним и начальным местоположением массива (или базовым адресом, arr) показывает общее количество элементов, присутствующих в данном массиве.

Заключение

Итак, в этом мануале мы обсудили различные методы определения длины массива в C++. Все приведенные выше методы просты в использовании, однако мы предпочитаем применять цикл for-each – не только из-за удобочитаемости кода, но и из-за его кросс-платформенной надежности.

Как зная длину массива определить размер шага

Массив хранит адрес первого элемента. Индекс i элемента - это сдвиг на i*sizeof(тип) байт от началаРис. 1 Массив хранит адрес первого элемента. Индекс i элемента — это сдвиг на i*sizeof(тип) байт от начала

Похожие статьи