Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
  1. Массивы в стиле языка с89

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

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

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

  • Для отделения ввода данных от их обработки.

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

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

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

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

    1. Определение и объявление массивов

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

      1. Определение и объявление одномерных массивов. Иницициализация одномерных массивов при их определении. Доступ к элементам массива.

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

Общий формат определения одномерного массива в стиле стандарта С89 имеет следующий:

<α> <>[<γ>] = <μ>;

Здесь α- тип элементов, хранящихся в массиве; - имя массива, [..] – оператор индексирования; γ – константное выражение, определяющее размер памяти, выделяемой для хранения элементов массива Конструкция «= <μ>» используется для инициализации массива; μ – список инициализаторов.

Обращает на себя внимание использование в объявлении и в определении массива оператора индексные скобки

Для обращения к отдельным элементам одномерного массива имеет сдующий формат:

<>[<σ>]

Здесь - имя массива, [] – оператор индексные скобки, σ- арифметическое целочисенное выражение, значение которого определяет индекс элемента.

Пример 1 Определение глобального и локального массива.

#define MSIZE1 20 int x[MSIZE]; int main(void) { double z[5]; z[0] = 10; }

В этом примере имеются опредеделения двух одномерных массивов. Первый массив (x) является глобальным. Он предназначен для хранения 20 элементов типа.int. В связи с тем, что определение этого массива находится вне функций, его элементы в момент выделения памяти будут обнулены. Второй массив (z) является локальным. Он предназначен для хранения 5 элементов типа.double. Элементы этого массива будут содержать «мусор». В теле функцииmain() с помощью оператора присваивания элементу массиваzс нулевым индексом присваивается значение 10.

Пример 2. Определение и объявление массивов.

Пусть в некоторой программе имеются два модуля. В первом модуле содержится функция main(), а во втором модулеcс именемmoduleсодержатся объявление и опрелеление массиваx.

// Первый модуль #inclde “module.h” int main(void) { // Работаем с массивом x x = 10; } // Второй модуль (module). Интерфейсный файлmodule.h#defineMSIZE20externx[]; // Это объявление массиваx// Второй модуль. Файл реализацииmodule.c#include“module1.c”intx[MSIZE];// Здесь выделяется память для массиваx

В интерфейсном файле module.hсодержится объявление массиваx. а в файле реализацииmodule.cнаходится определение массиваx. Функция полчает доступ к этому массиву, что позволяет ей записать в элементx[0] значение 10.

Пример 3. Инициализация массива во время определения

Рассмотрим программный код, приведенный ниже.

#define MSIZE 5 int main(void) { int x1[MSIZE] = {1, 3, 5, 7, 9}; int x2[MSIZE] = {1, 3, 5}; int x3[MSIZE] = {1, 3, 5, 7, 9, 11};// Ошибка int x4[] = {1, 3, 5, 7, 9}; int x5[MSIZE] = {0}; }

В рассматриваемом коде объявлено пять массивов. Все массивы имеют одинаковый размер, определяемый константой MSIZE, равной 5. Здесть количество элементов в массиве совпадает с количеством инициализаторов. При объявлении массиваx1 список инициализации содержит 5 констант. Элементx1[0] этого массива инциализируется первой константой, равной 1, затем элементx1[1] инициализируется константой 2 и т. д. Наконец, элементx1[4] инициализируется последней константой из списка инициализации, равной 9. Количество элементов массива и количество инциализаторов может не совпадать. Если количество элементов массива превышает количество инициализаторов, то элементы массива, для которых «не хватило» инициализаторов обнуляются. Например,x2[3] ==x2[4] == 0; Случай, когда инициализаторов превышает количество элементов массива, рассматривается как ошибочный. При компиляции определения массиваx3 будет выдано сообщение об ошибке. Заметим, что при наличии списка инициализации размер требуемой памяти можно не указывать, что, и сделано при определении массиваx4.