Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ОАиП.docx
Скачиваний:
127
Добавлен:
09.03.2016
Размер:
139.71 Кб
Скачать

44.Массивы и указатели. Понятие индекса. Инициализация. Доступ к компонентам.

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

int values[5] = { 100, 200, 300, 400, 500 };

Подобным образом следующее объявление инициализирует массив с плавающей точкой:

float salaries[3] = { 25000.00. 35000.00, 50000.00 };

Если вы не указываете первоначальное значение для какого-либо элемента массива, большинство компиляторов C++ будут инициализировать такой элемент нулем. Например, следующее объявление инициализирует первые три из пяти элементов массива:

int values[5] = { 100, 200, 300 };

Программа не инициализирует элементы values[3] и values[4]. В зависимости от вашего компилятора, эти элементы могут содержать значение 0. Если вы не указываете размер массива, который вы инициализируете при объявлении, C++ распределит достаточно памяти, чтобы вместить все определяемые элементы. Например, следующее объявление создает массив, способяый хранить четыре целочисленных значения:

int numbers[] = { 1, 2, 3, 4 };

Массив позволяет вашим программам хранить несколько значений внутри одной и той же переменной. Для обращения к определенному значению внутри массива программы используют индекс. Говоря кратко, значение индекса указывает требуемый элемент массива. Все массивы C++ начинаются с элемента с индексом 0. Например, следующий оператор присваивает значение 100 первому элементу массива с именем scores:

scores[0] = 100;

Когда ваша программа объявляет массив, она указывает количество элементов, которые массив может хранить. Например, следующий оператор объявляет массив, способный хранить 100 значений типа int.

int scores[100];

В данном случае массив представляет собой элементы от scores[0] до scores[99].

45.Многомерные массивы. Связь между указателями и массивами. Связь между массивами и указателями

Хотя указатель char* mи массив charm[100] – переменные разных типов, имя массива рассматривается транслятором как указатель на начальный элемент массива. Адресные выраженияm[n] и *(m + n) эквивалентны.

Замечание. Из эквивалентности адресных выражений следует:

m[n] <=> *(m + n) <=> *(n + m) <=>n[m]

т.е. обратиться к элементу массива m[n] можно и формате n[m]. Пример. Скопировать содержимое массива A в массив B.

int a[]={1,2,3,4,5,6,7,8,9}, B[9];

int i;

// 1-йспособ, самыйпонятный for (i = 0; i < 9; i++) B[i] = A[i];

// 2-йспособ for (i = 0; i < 9; i++) *(B + i) = *(A + i);

// 3-йспособ

int*a, *b; for (a = A, b = B, i= 0; i < 9; i++) *(b++) = *(a++);

Вычитание указателей имеет смысл, только если оба они указывают на элементы одного массива. Связь между массивами и указателями распространяется и на двумерные массивы, m[i][j] означает то же самое, что *(*(m + i) + j).

Замечание. Пусть массив определен как intm[3][4]. В соответствии с арифметикой указателей транслятор вычисляет адресное выражение *(*(m + i) + j) или, что то же самое, m[i][j] так:

(адрес начала массива m) + i*(размер одномерного массива из 4-х целых чисел) + j*(размер целого числа).

Отсюда следует, что для вычисления адресного выражения m[i][j] транслятору необходимо знать лишь вторую размерность массива, но не первую.

Выражение m[i] рассматривается транслятором как имя одномерного массива из 4-х целых чисел, поэтому все следующие выражения правильны и обозначают одно и то же, а именно, m[2][3]: *(m[2]+3), (*(m+2))[3], 3[m[2]], 3[2[m]].