Vvmebel.com

Новости с мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Что такое массив в программировании

Что такое массивы в программировании?

Массив – это переменная, которая является совокупностью компонентов одного типа. Чтобы использовать массивы в программировании, потребуется предварительное описание определенного типа и указание доступа к элементам. Элементы массива в программировании объединены общим именем. Если требуется обратиться к определенному элементу массива, то достаточно указать имя и индекс. В математике есть понятный пример массива – это векторы и последовательности чисел, в которых группа чисел может обозначаться одним именем. Обратившись к конкретному числу, используют разные индексы.

Виды массивов: одномерные и двухмерные

Если для обращения к элементам использован единственный порядковый номер, то массив называется одномерный или линейный. Выглядит как таблица с одной строкой. Размерность массива определяется посредством количества индексов элементов.

Когда использовано два индекса, то массив будет двухмерным. Если массив представлен в идее таблицы, то номер строки будет соответствовать первому индексу, а номер столбца или ячейки – второму.

Как заполнить массив?

Одним из способов заполнения массива является оператор присваивания. Когда элементы связаны реккурентно и имеют определенную зависимость, подойдет такой способ заполнения. Также можно заполнить однородный массив однородными элементами или значениями, которые получены посредством датчика случайных чисел. В таком случае все элементы будут различны: подробнее об этом читайте на http://pmbk.ru.

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

• Сортировка элементов в определенном порядке – убывание или возрастание

• Подсчет количества элементов в массиве, соответствующих определенному условию

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

Как объявить массив

Чтобы объявить массив и выделить в памяти ячейку для хранения элементов, следует указать размерность и имя. Ключевое слово – массив. К примеру, А 20 означает, что одномерный массив состоит из двадцати элементов. К 6,5 означает, что это двухмерный массив, который представлен в виде таблицы из шести строк и пяти ячеек. Если говорить об ограничениях одномерного массива в программировании, то оно составляет тысячу элементов. Для двухмерных массивов максимально допустимым значением станет таблица из тысячи строк и тысячи ячеек.

Массивы в программировании: работа с ними

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

Типы имени, элементов, индексов

Как придумать имя массиву? Подойдет произвольный идентификатор. По правилам стиля имя должно начинаться с буквы Т большого шрифта. Таким образом, можно отличить идентификатор от других. Последующую часть имени можно придумать в соответствии с конкретными данными для хранения в массиве. Вторая составляющая имени также должна начинаться с заглавной буквы. T Vector может хранить информацию о координатах абстрактного вектора.

Что касается типа элементов в массиве, то это может быть ранее введенный или стандартный. Для создания индексов используются целые числа, а типом станет диапазон. Допустим, тип 1…20 говорит о том, что массив состоит из двадцати элементов, каждый из которых соответствует целому числу от одного до двадцати.

Что такое массивы в программировании и зачем они нужны?

Сегодня мы поговорим об одном из основополагающих понятий в программировании — о массиве.

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

Как это сделать? Все компоненты массива, как единого комплекса, объединяются под одним именем, общим для них. Если вам понадобится поработать с конкретным компонентом массива, нужно будет только указать его название и индекс.

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

Всего массивы бывают двух видов — одномерные (линейные) и двухмерные

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

Соответственно – двухмерный отличается тем, что у него два индекса, вместо одного.

Если обратиться к табличному виду, то первый индекс будет равен показателю строчки, а второй – показателю ячейки или столбика.

Как заполнить данные правильно?

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

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

Что можно делать с компонентами массива?

Выстроить по убыванию или возрастанию (рассортировать);

Найти их значения;

Посчитать сколько компонентов подпадают под выставленные вами параметры.

При создании двух одинаковых совокупностей данных, есть возможность объединить их под именем одного их них.

Для начала работы с массивом, нужно его объявить. Как это сделать?

Для объявления массива и создания конкретной ячейки, предназначенной для последующего сохранения элементов, от вас потребуется задать размерность и придумать название. Выбираем «Массив» в качестве ключевого слова.

Допустим, C 77 подразумевает, что массив одномерен и состоит из 77 компонентов.

A 7,4 является двухмерным и визуализирован в табличной форме, насчитывающей 7 строчек, в каждой из которых по 5 ячеек.

Существуют ли какие-то ограничения при использовании одномерного массива? Да, мы можем создать и применять только 1000 компонентов. Примерно так же нас ограничивает и двухмерный массив — таблица будет представлена максимум 1000 столбиков с 1000 ячеек.v

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

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

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

Какие бывают виды компонентов, индексов и имен?

Как создать имя для массива? Для этой цели можно применить произвольный идентификатор. У нас есть условия, что название нужно начинать с T. Именно так можно будет отличать каждый конкретный идентификатор от всех прочих.

Дальнейшую часть названия составляют, беря за основу переменные, хранящиеся в самом массиве.

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

Приведем простой пример: тип 1…777 будет значить, что созданный нами массив насчитывает 777 компонентов, где каждый из которых равен какому-либо числу от 1 до 777.

Читать еще:  Python 3 среда программирования

Надеемся, что мы смогли раскрыть вам основные термины и процессы при работе с массивами в программировании.

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

Массив (программирование)

Индексный массив (в некоторых языках программирования также таблица, ряд) — именованный набор однотипных переменных, расположенных в памяти непосредственно друг за другом (в отличие от списка), доступ к которым осуществляется по индексу.

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

В ряде скриптовых языков, например PHP, ассоциативные массивы, в которых переменные не обязаны быть однотипными, и доступ к ним не обязательно осуществляется по индексу.

Содержание

Общее описание

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

Количество используемых индексов массива может быть различным. Массивы с одним индексом называют одномерными, с двумя — двумерными и т. д. Одномерный массив нестрого соответствует вектору в математике, двумерный — матрице. Чаще всего применяются массивы с одним или двумя индексами, реже — с тремя, ещё большее количество индексов встречается крайне редко.

Пример статического массива на Паскале

Пример статического массива на Си

Поддержка индексных массивов (свой синтаксис объявления, функции для работы с элементами и т. д.) есть в большинстве высокоуровневых языков программирования. Максимально допустимая размерность массива, типы и диапазоны значений индексов, ограничения на типы элементов определяются языком программирования и/или конкретным транслятором.

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

Объявление типа «массив» в Паскале

Специфические типы массивов

Динамические массивы

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

Пример динамического массива на Delphi

Пример динамического массива на Си

Гетерогенные массивы

Гетерогенным называется массив, в разные элементы которого могут быть непосредственно записаны значения, относящиеся к различным типам данных. Массив, хранящий указатели на значения различных типов, не является гетерогенным, так как собственно хранящиеся в массиве данные относятся к единственному типу — типу «указатель». Гетерогенные массивы удобны как универсальная структура для хранения наборов данных произвольных типов. Отсутствие их поддержки в языке программирования приводит к необходимости реализации более сложных схем хранения данных. С другой стороны, реализация гетерогенности требует усложнения механизма поддержки массивов в трансляторе языка.

Массивы массивов

Многомерные массивы, как правило реализованные как одномерные массивы, каждый элемент которых, является ссылкой на другой одномерный массив.

Реализация

Стандартным способом реализации статических массивов с одним типом элементов является следующий:

  1. Под массив выделяется непрерывный блок памяти объёмом S*m1*m2*m3…mn, где S — размер одного элемента, а m1…mn — размеры диапазонов индексов (то есть количество значений, которые может принимать соответствующий индекс).
  2. При обращении к элементу массива A[i1, i2, i3, … in] адрес соответствующего элемента вычисляется как B+S*(i1p*m1+i2p*m2+…+i(n-1)p*mn-1+inp), где B — база (адрес начала блока памяти массива), ikp-значение k-го индекса, приведённое к целому с нулевым начальным смещением.

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

Первый элемент массива, в зависимости от языка программирования, может иметь различный индекс. Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based), и с отсчетом от специфического значения заданного программистом (n-based). Отсчет индекса элемента массивов с нуля более характерен для низкоуровневых ЯП, однако этот метод был популяризирован в языках более высокого уровня языком программирорования С.

Более сложные типы массивов — динамические и гетерогенные — реализуются сложнее.

Достоинства

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

Недостатки

  • для статического массива — отсутствие динамики, невозможность удаления или добавления элемента без сдвига других
  • для динамического и/или гетерогенного массива — более низкое (по сравнению с обычным статическим) быстродействие и дополнительные накладные расходы на поддержку динамических свойств и/или гетерогенности.
  • при работе с массивом в стиле C (с указателями) и при отсутствии дополнительных средств контроля — угроза выхода за границы массива и повреждения данных

См. также

Ссылки

Wikimedia Foundation . 2010 .

Смотреть что такое «Массив (программирование)» в других словарях:

Массив — У этого термина существуют и другие значения, см. Массив (значения). Эту страницу предлагается переименовать в Массив (информатика). Пояснение причин и обсуждение на странице Википедия:К переименованию/4 ноября 2012. Возможно, её … Википедия

Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных метаклассы, интерфейсы, структуры, перечисления характеризуются какими то своими, другими… … Википедия

Коллекция (программирование) — У этого термина существуют и другие значения, см. Коллекция. Для улучшения этой статьи желательно?: Найти и оформить в виде сносок ссылки на авторитетные исто … Википедия

Интерфейс (объектно-ориентированное программирование) — У этого термина существуют и другие значения, см. Интерфейс (значения). Интерфейс (от лат. inter «между», и face «поверхность») семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования… … Википедия

Полиморфизм (программирование) — У этого термина существуют и другие значения, см. Полиморфизм. Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью … Википедия

Функциональное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия

Автоматное программирование — Автоматное программирование это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого либо формального автомата. В зависимости от конкретной задачи в автоматном программировании… … Википедия

Объект (программирование) — У этого термина существуют и другие значения, см. Объект (значения). Объект в программировании некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и… … Википедия

Читать еще:  Что такое многопоточность в программировании

Очередь (программирование) — У этого термина существуют и другие значения, см. Очередь. Очередь структура данных с дисциплиной доступа к элементам «первый пришёл первый вышел» (FIFO, First In First Out). Добавление элемента (принято обозначать словом… … Википедия

Ссылка (программирование) — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете … Википедия

Дадим формальное определение:

массив — структурированный тип данных, состоящий из некоторого числа элементов одного типа.

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

· Как описать массивв программе?

· Как инициализировать массив, то есть как задать начальные значения его элементов?

· Как организовать доступк элементам массива?

· Как организовать массивыс размерностью более одной?

· Как организовать выполнениетиповых операций с массивами?

Описание и инициализация массива в программе

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

1. Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми. К примеру:

;массив из 5 элементов.Размер каждого элемента 4 байта:

2. Используя оператор повторения dup. К примеру:

;массив из 5 нулевых элементов.

;Размер каждого элемента 2 байта:

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

3. Используя директивы labelиrept. Пара этих директив может облегчить описание больших массивов в памяти и повысить наглядность такого описания. Директиваreptотносится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm. К примеру, определим массив байт в области памяти, обозначенной идентификаторомmas_b. В данном случае директиваlabelопределяет символическое имяmas_b, аналогично тому, как это делают директивы резервирования и инициализации памяти. Достоинство директивыlabelв том, что она не резервирует память, а лишь определяет характеристики объекта. В данном случае объект — это ячейка памяти. Используя несколько директивlabel, записанных одна за другой, можно присвоить одной и той же области памяти разные имена и разный тип, что и сделано в следующем фрагменте:

mas_b label byte

mas_w label word

В результате в памяти будет создана последовательность из четырех слов f1f0. Эту последовательность можно трактовать как массив байт или слов в зависимости от того, какое имя области мы будем использовать в программе —mas_bилиmas_w.

4. Использование цикла для инициализации значениями области памяти, которую можно будет впоследствии трактовать как массив.

5. Посмотрим на примере листинга 2, каким образом это делается.

Листинг 2 Инициализация массива в цикле

mes db 0ah,0dh,’Массив- ‘,’$’

mas db 10 dup (?) ;исходный массив

xor ax,ax ;обнуление ax

mov cx,10 ;значение счетчика цикла в cx

mov si,0 ;индекс начального элемента в cx

go: ;цикл инициализации

mov mas[si],bh ;запись в массив i

inc i ;инкремент i

inc si ;продвижение к следующему элементу массива

loop go ;повторить цикл

;вывод на экран получившегося массива

mov ah,02h ;функция вывода значения из al на экран

add dl,30h ;преобразование числа в символ

mov ax,4c00h ;стандартный выход

end main ;конец программы

Доступ к элементам массива

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

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

Эти же соображения можно распространить и на индексы элементов массива. Ассемблер не подозревает об их существовании и ему абсолютно все равно, каковы их численные смысловые значения.

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

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

Пусть эта последовательность чисел трактуется как одномерный массив. Размерность каждого элемента определяется директивой dw, то есть она равна2байта. Чтобы получить доступ к третьему элементу, нужно к адресу массива прибавить6. Нумерация элементов массива в ассемблере начинается с нуля.

То есть в нашем случае речь, фактически, идет о 4-м элементе массива — 3, но об этом знает только программист; микропроцессору в данном случае все равно — ему нужен только адрес.

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

база + (индекс*размер элемента)

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

· индексная адресация со смещением — режим адресации, при котором эффективный адрес формируется из двух компонентов:

o постоянного (базового)— указанием прямого адреса массива в виде имени идентификатора, обозначающего начало массива;

o переменного (индексного)— указанием имени индексного регистра.

;поместить 3-й элемент массива mas в регистр ax:

· базовая индексная адресация со смещением — режим адресации, при котором эффективный адрес формируется максимум из трех компонентов:

o постоянного(необязательный компонент), в качестве которой может выступать прямой адрес массива в виде имени идентификатора, обозначающего начало массива, или непосредственное значение;

o переменного (базового)— указанием имени базового регистра;

o переменного (индексного)— указанием имени индексного регистра.

Этот вид адресации удобно использовать при обработке двухмерных массивов. Пример использования этой адресации мы рассмотрим далее при изучении особенностей работы с двухмерными массивами.

Напомним, что в качестве базового регистра может использоваться любой из восьми регистров общего назначения. В качестве индексного регистра также можно использовать любой регистр общего назначения, за исключением esp/sp.

Микропроцессор позволяет масштабировать индекс. Это означает, что если указать после имени индексного регистра знак умножения “*” с последующей цифрой 2, 4 или 8, то содержимое индексного регистра будет умножаться на 2, 4 или 8, то есть масштабироваться.

Применение масштабирования облегчает работу с массивами, которые имеют размер элементов, равный 2, 4 или 8 байт, так как микропроцессор сам производит коррекцию индекса для получения адреса очередного элемента массива. Нам нужно лишь загрузить в индексный регистр значение требуемого индекса (считая от 0). Кстати сказать, возможность масштабирования появилась в микропроцессорах Intel, начиная с модели i486. По этой причине в рассматриваемом здесь примере программы стоит директива .486. Ее назначение, как и ранее использовавшейся директивы.386, в том, чтобы указать ассемблеру при формировании машинных команд на необходимость учета и использования дополнительных возможностей системы команд новых моделей микропроцессоров.

Читать еще:  Уроки программирования с нуля

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

Листинг 3. Просмотр массива слов с использованием

Понятие массивов в программировании на C

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

Встраиваемые системы часто имеют дело с данными, которые принадлежат скорее к группе однотипных данных, а не к совокупности независимых переменных. Одним из примеров, который легко приходит на ум, является последовательность значений, которая соответствует оцифрованной версии аналогового сигнала. Другие примеры включают в себя байты, которые будут сериализованы и отправлены на LCD дисплей, длинный ряд измерений, которые должны быть проанализированы или переданы на другое устройство для обработки, и небольшая группа символов ASCII, которые составляют сообщение UART.

В некоторых случаях было бы возможно, хотя и неудобно, хранить эти данные в отдельных переменных – например, ADC_value1 , ADC_value2 , ADC_value3 и так далее. Однако часто использование отдельных переменных было бы совершенно непрактичным. К счастью, язык C предоставляет простой и очень эффективный способ работы с большими (или маленькими) группами переменных. Возможность, о которой я здесь говорю, называется массивом.

Что такое массив?

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

Рисунок 1 – Для массивов требуется указать тип данных, идентификатор и количество элементов

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

  • Все элементы в массиве должны иметь одинаковый тип данных. Например, вы не можете иметь массив, который состоит из переменных char и int .
  • Объем памяти, необходимый для массива, не обязательно совпадает с количеством элементов. Если ваш массив имеет тип данных char и длину 20, он будет использовать 20 байт памяти. Однако если он состоит из 20 элементов с типом long , компилятор должен зарезервировать 80 байтов памяти. Большой массив может занимать значительную часть оперативной памяти микроконтроллера, поэтому убедитесь, что вы не используете излишне большой тип данных. Если все числа в массиве будут меньше или равны 255, объявите массив как unsigned char , а не int .
  • Компилятор будет хранить элементы массива в смежных местах памяти; у вас не будет такой ситуации, когда несколько элементов массива расположены в одном разделе вашей памяти, а затем остальные элементы массива – в совершенно другом разделе. Это означает, что вы можете легко проверить содержимое массива, используя возможности проверки памяти вашего интерфейса отладки (хотя сначала вы должны найти начальный адрес массива).

Как использовать массив

Массив объявлен так:

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

В следующем фрагменте кода используется цикл for для заполнения массива числовыми значениями, начинающимися с нуля и заканчивающимися на 99.

Нулевой элемент

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

Рисунок 2 – Первый элемент массива всегда является нулевым

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

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

Последний элемент

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

Если вы используете размер массива в качестве индекса, вы получите доступ к памяти, которая не включена в массив. Это может быть что угодно – неиспользуемая память, начало другого массива, часть совершенной не связанной переменной. Это серьезная ошибка, которая может привести к сбою кода чрезвычайно проблемными способами. Будьте особенно осторожны с циклами, в которых индекс массива увеличивается с каждой итерацией. Цикл должен быть спроектирован таким образом, чтобы итерации прекращались до того, как индекс достигнет числа, равного размеру массива.

Инициализация массива

Массивам, как и отдельным переменным, могут быть заданы начальные значения. Последовательность значений заключается в фигурные скобки, а отдельные значения разделяются запятыми. Например:

Ранее я упоминал, что в объявление массива мы обычно включаем количество элементов. Я сказал «обычно», потому что, если вы включаете последовательность начальных значений, то можете позволить компилятору самому определить необходимую длину.

Это удобно, когда вы используете массив для хранения довольно длинной последовательности символов ASCII, возможно, для целей отладки или для связи через последовательный порт.

Обратите внимание, что символы заключены в двойные кавычки, и фигурные скобки не нужны.

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

Рисунок 3 – Представление содержимого памяти, созданного объявлением массива, показанным в приведенном выше фрагменте кода

Заключение

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

Ссылка на основную публикацию
Adblock
detector