КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Векторы. Логическая структура. Вектор (одномерный массив) - структура данных с фиксированным числом элементов одного и того же типа
ЛОГИЧЕСКАЯ СТРУКТУРА. Вектор (одномерный массив) - структура данных с фиксированным числом элементов одного и того же типа. Каждый элемент вектора имеет уникальный в рамках заданного вектора номер. Обращение к элементу вектора выполняется по имени вектора и номеру требуемого элемента. МАШИННОЕ ПРЕДСТАВЛЕНИЕ. АДРЕСАЦИЯ ЭЛЕМЕНТОВ СТРУКТУР. Элементы вектора размещаются в памяти в подряд расположенных ячейках памяти. Под элемент вектора выделяется количество байт памяти, определяемое базовым типом элемента этого вектора. Необходимое число байтов памяти для хранения одного элемента вектора называется слотом. Размер памяти для хранения вектора определяется произведением длины слота на число элементов. В языках программирования вектор представляется одномерным массивом с синтаксисом описания вида: С: <тип_элементов> <Имя_массива>[N]; где N – количество элементов в массиве. Представление в памяти вектора будет такое, как показано на рис. 2.1.
Рис. 2.1. Представление вектора в памяти
Здесь @ Имя - адрес вектора или, что то же самое, адрес первого элемента вектора, Sizeof(тип) - размер слота (количество байт памяти для записи одного элемента вектора), (k)*Sizeof(тип) - относительный адрес элемента с номером k, или, что то же самое, смещение элемента с номером k. Заметьте, номерация элементов в массиме начинается с нуля.
Например: float m1[5]; представление данного вектора в памяти будет как на рис. 2.2.
Рис. 2.2. Представление вектора m1 в памяти
В языках, где память распределяется до выполнения программы на этапе компиляции (C, PASCAL, FORTRAN), при описании типа вектора граничные значения индексов должны быть определены. В языках, где память может распределяться динамически (ALGOL, PL/1), значения индексов могут быть заданы во время выполнения программы. Количество байт непрерывной области памяти, занятых одновременно вектором, определяется по формуле: ByteSise = (N) * Sizeof (тип) Обращение к i -му элементу вектора выполняется по адресу вектора плюс смещение к данному элементу. Смещение i -го элемента вектора определяется по формуле: ByteNumer = (i) * Sizeof (тип), а адрес его: @ ByteNumber = @ имя + ByteNumber. где @ имя - адрес первого элемента вектора, а . Например: short mas[6]; Базовый тип элемента вектора - SHORT требует 2 байта, поэтому на каждый элемент вектора выделяется по два байта. Тогда табл. 2.1 смещений элементов вектора относительно @Mas выглядит так:
Таблица 2.1
Этот вектор будет занимать в памяти: 6*2 = 12 байт. Смещение к элементу вектора с номером 3: 3*2 = 6 Адрес элемента с номером 3: @ MAS + 6. При доступе к вектору задается имя вектора и номер элемента вектора. Таким образом, адрес i -го элемента может быть вычислен как: @Имя[i] = @Имя + i*Sizeof(тип) (2.1)
Индексация массивов в C обязательно начинается с нуля. Компилятор каждое обращение к элементу массива, заменяет на последовательность команд, реализуемых формулой (2.1).
Программисты, привыкшие работать на C, часто вместо выражения вида: Имя[i] употребляют выражение вида: *(Имя+i). Но, отсутствие жестких граничных значений индексов массива в языке С (нельзя массив задать, как <тип> <Имя>[n..k], где n, k – крайние индексы, как в языке PASCAL), делает невозможным контроль выхода за пределы массива. Программисты, работающие с C, хорошо знают, что именно такие ошибки часто являются причиной "зависания" C-программы при ее отладке. Таких минусов нету в языке PASCAL, там информация о границах и начале массива, сохраняется в его дискрипторе.
Дата добавления: 2014-01-07; Просмотров: 1156; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |