Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры / ООП(Тимофеев) / ООП-Тимофеев.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
328.19 Кб
Скачать

Индексирование

Предположим, было сделано объявление вида:int i, а [размер];

Тогда для доступа к элементу массива мы можем написать: а[ i ]. В общем слу­чае эта запись выглядит так: а [выражение], где выражение это целое выражение. Указанное выражение мы называем индексом (subscript или index) элемента массива а. В C++ значение индекса должно лежать в диапазоне от 0 до размер -1. Программист всегда должен быть уверен, что все индексы находятся в пределах этих границ.

Многомерные массивы

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

Объявления массивов

Int a [100]; одномерный массив

Int b [3][5]; двухмерный массив

Int c [7][9][2]; трехмерный массив

Любой k-мерный массив имеет размер по каждому из своих k измерений. В приведенной таблице b содержит 3 Х 5 элементов, а c – 7 х 9 х 2 элементов. Начиная с базового адреса массива все элементы хранятся в памяти последовательно.

Инициализация

Массив может быть инициализован с помощью заключенного в фигурные скобки списка выражений, разделенных запятыми:int а[4] = {9, 8, 7}; //а[0]=9, а[1]=8, а[2]=7

Когда список инициализаторов короче размера массива, остальные элементы инициализуются нулем. Неинициализованные внешние и статические массивы автомати­чески инициализ уются нулем. Однако автоматические массивы открываются с нео­пределенными значениями.

Массиву, объявленному с явным списком инициализаторов, но без задающего его размер выражения, дается размер, соответствующий количеству инициализа­торов: char laura[ ] = {‘l’, ‘m’, ‘p’}; равнозначно char laura[3] = {‘l’, ‘m’, ‘p’};

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

nt а[2][3] = { {1, 2, 3}, {4, 5, 6} }; //то же, что {1, 2, 3, 4, 5, 6}

char name[3][9] = { "laura", "michele", "pohl" }; //завершенные '\0'

Связь между массивами и указателями Имя массива само по себе является адресом или значением указателя. Массивы и указатели почти идентичны в смысле их использования для доступа к памяти. Од­нако существуют едва уловимые, но важные различия. Указатель — это переменная, принимающая в качестве значения адрес. А имя массива является конкретным фиксированным адресом, который может пониматься как постоянный указатель на первый (с индексом 0) элемент массива. Допустим, что мы написали следующее объявление:const int N = 100; int a[N], *p;

и что система назначила байты памяти 300, 304, 308, ... , 696 в качестве адресов для хранения а[0],а[1],а[2],...,а[99] соответственно; при этом адрес 300 стал базовым адресом массива а. Мы полагаем, что каждый байт памяти адресуем, а для хранения целого используется четыре байта. Две инструкции

p = a; и p = &a[0]; являются равнозначными и присваивают p значение 300. Арифметика указателей предлагает альтернативу индексированию массивов. Две инструкции p = a + 1; и p = & a [1]; равнозначны и присваивают p значение 304. Предположив, что элементам a были присвоены значения, мы можем использовать следующий код для суммирования массива:

sum = 0; for (p = a; p < & a[N]; ++p) sum += *p; это равносильно

sum = 0; for (i = 0; i < N; ++i) sum += a[i];

Еще один способ суммирования массива:

sum = 0; for (i=0; i<N; ++i) sum += *(a +i)

Также как выражение *(a+i) равносильно а[i], выражение * (p + i ) равносильно p[i].

Мы не можем изменить адреса, отметим, что sizeof (a) и sizeof (p) различны. Первое выражение дает размер всего массива, тогда как второе – размер выражения – указателя.

Соседние файлы в папке ООП(Тимофеев)