- •Е. А. Альтман основы языка с омск 2012
- •Введение
- •Лабораторная работа 1 Изучение среды программирования
- •Теоретические сведения
- •1.1.Среда программирования
- •Задание к работе
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа 2 Переменные и операции над ними
- •Теоретические сведения
- •2.1.Основные определения
- •2.2.Операции над целыми числами
- •2.3.Вещественные числа и операции над ними
- •Задание к работе
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа 3 Конструкция выбора, логические и другие операции
- •Теоретические сведения
- •3.1.Конструкция выбора и составная инструкция
- •3.2.Операторы отношения и логические операторы
- •3.3.Остальные операторы
- •Задание к работе
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа 4 Конструкции циклов
- •Теоретические сведения
- •4.1.Цикл while
- •4.2.Цикл for
- •4.3.Конструкция в конструкции
- •Задание к работе
- •5.2.Свойства массивов
- •5.3.Строки
- •5.4.Структуры
- •Задание к работе
- •6.2.Операции с указателями
- •6.3.Указатели и массивы
- •6.4.Указатели и структуры
- •Задание к работе
- •7.2.Использование указателей для передачи результата и аргумента
- •Задание к работе
- •Содержание отчета
- •Контрольные вопросы
- •Библиографический список
- •644046, Г. Омск, пр. Маркса, 35
5.2.Свойства массивов
Как видно из рассмотренного примера, массив позволяет создать определенное количество переменных одного типа и обращаться к ним по индексу. Отметим некоторые важные особенности массивов.
Массивы могут содержать переменные любых типов. Так, например, можно объявить массив из 10 вещественных чисел:
float a[10];
Как и переменные, массив можно инициализировать при объявлении. Для этого нужно указать элементы массива в фигурных скобках через запятую. При этом указывать размер массива в квадратных скобках необязательно. Например:
float a[] = {1, 1.5, 2, 2.5, 3};
Компилятор выделяет память под элементы массива во время компиляции. Это приводит к тому, что мы не можем определить размер массива во время исполнения программы (например, на основе введенных пользователем данных), а должны точно указать его во время написания программы.
Все элементы массива должны быть одного типа. Другими словами, все элементы массива занимают одинаковый объем памяти и над ними можно выполнять одинаковые операции.
Благодаря этому свойству мы и можем обращаться к элементу массива по индексу. Положение нужного элемента вычисляется путем прибавления к адресу начала массива произведения индекса на размер элемента. Эта операция называется операцией индексирования. А квадратные скобки, которые указывают компилятору, что нужно выполнить эту операцию, называются оператором индексирования.
Можно сказать, что оператор индексирования a[i] фактически означает сумму адреса первого элемента и числа i умноженного на размер одного элемента.
Важно отметить два важных последствия такого свойства оператора индексирования.
Поскольку первый элемент массива расположен в самом его начале, то он должен иметь индекс 0. Поэтому массивы в С и нумеруются с 0.
Оператор индексирования не сравнивает передаваемый ему индекс с размером массива. Если в программе был создан массив из 10 элементов, а затем произошло обращение к 15 элементу, компилятор не выдаст сообщения об ошибке. Это может привести к тому, что вы запишите данных в область памяти за пределами массива или даже за пределами вашей программы.
Выход за границы массива – самая распространенная ошибка в программах на языке С. Поэтому еще раз повторим то, что нужно всегда держать в памяти, работая с массивами. В С оператор индексирования лишь прибавляет к адресу начала массива смещение элемента с указанным индексом и никак не контролирует границы массива.
В других языках программирования, или при использовании специальных библиотек языка С, может быть использована более высокоуровневая концепция массива. Более высокий уровень концепции массива подразумевает, что операторы выполняют за программиста часть действий. В простейшем случае элементы высокоуровневого массива нумеруются в естественном порядке, начиная с 1. Бывают массивы, в которых при попытке вызова элемента, находящегося за границей массива, происходит сообщение об ошибке (например, в языке Паскаль). Возможна реализация динамических массивов, размеры которого можно изменить во время исполнения программы. Обратной стороной высокоуровневых массивов является большее количество операций, требуемых при обращении к элементу массива, и, как следствие, более медленная работа программ.