Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_Программирование.doc
Скачиваний:
8
Добавлен:
08.11.2018
Размер:
477.7 Кб
Скачать
      1. Свойства массивов

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

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

float a[10];

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

float a[] = {1, 1.5, 2, 2.5, 3};

Компилятор выделяет память под элементы массива во время компиляции. Это приводит к тому, что мы не можем определить размер массива во время исполнения программы (например, на основе введенных пользователем данных), а должны точно указать его во время написания программы.

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

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

Можно сказать, что оператор индексирования a[i] фактически означает сумму адреса первого элемента и числа i умноженного на размер одного элемента.

Важно отметить два важных последствия такого свойства оператора индексирования.

Поскольку первый элемент массива расположен в самом его начале, то он должен иметь индекс 0. Поэтому массивы в С и нумеруются с 0.

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

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

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

      1. Строки

Массив из символов (элементов типа char) часто называется строкой. Строки позволяют хранить фразы на естественном языке, например, на русском.

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

Наиболее удобным оказалось хранить информацию о реальной длине строки прямо в массиве символов. Для этого используется специальный символ обозначаемый как «\0». Функция, работаю со строкой, например, печатающая ее, будет обрабатывать символы по порядку, пока не встретит символ «\0».

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

char a[] = “Привет”;

Символ a[0] будет равен 'П', символ a[5] будет равен 'т', а символ a[5] будет равен '\0'. Обратите внимание, что когда мы записываем символы в двойных кавычках, то это будет строка, заканчивающаяся '\0', а если в одинарных – то это один символ. Так, запись “П” будет состоять из 2 символов, а запись 'Пр’ вызовет ошибку.

Для удобства работы со строками функции форматированного ввода-вывода (printf и scanf) содержат специальный спецификатор строки – «%s». Например, напечатать объявленную выше строку можно следующим образом:

printf(“%s”, a);

Для работы со строками в языке С есть целая стандартная библиотека – string.h. Например, следующая функция копирует (переписывает) строку scr в строку dest:

strcpy(dest, scr);

С полным списком функций этой библиотеки можно ознакомиться в [1].