- •Адреса, указатели, ссылки, массивы Указатели и адреса объектов
- •Объявление и инициализация указателей
- •Инициализация указателей
- •Указатели константы и на константы
- •Типы указателей и операции над ними
- •Указатели на основные типы данных - на арифметические данные и на символьные.
- •Операции над указателями
- •Понятие указателя на указатель
- •Аддитивные операции
- •I. Вычитание
- •Вычитание из указателя целое число:
- •II. Сложение указателя с целым значением
- •Объявление ссылки
- •Инициализация ссылок не обязательна:
- •Массивы
- •Форма объявления одномерного массива (вектора) type имя массива [k];
- •Type имя массива [ k 1] [ k2] …[kn];
- •Внутреннее представление массивов в оперативной памяти
- •Инициализация числовых и символьных массивов.
- •Инициализации символьных массивов
- •Массивы и указатели
- •Указатели и строки
- •Ввод/вывод элементов массивов Ввод/вывод числовых массивов
- •Ввод/вывод символьных массивов
- •Создание динамических массивов.
- •Имя указателя [индекс элемента]
- •Массивы указателей
- •Создание двумерного динамического массива с помощью динамического массива указателей.
- •Указатель на массив. Многомерные массивы динамической памяти.
- •Определение типа массива
- •Определение типа указателя на массив
Инициализация числовых и символьных массивов.
Инициализация- это задание начальных значений объектов программы при их определении, проводится на этапе компиляции.
Инициализация одномерных массивов
Возможна двумя способами: либо с указанием размера массива в квадратных скобках, либо без явного указания:
int test [ 4] = { 10, 20 , 30 ,40 };
char ch [ ] = { ‘a’ , ‘b’ , ‘c’ , ‘d’ };
Список инициализации помещается в фигурные скобки при определении массива.
В первом случае инициализация могла быть не полной, если бы в фигурных скобках находилось меньше значений, чем четыре.
Во втором случае инициализация должна быть полной, и количество элементов массива компилятор определяет по числу значений в списке инициализации.
Инициализация многомерных числовых массивов.
Массив любой мерности в С++ рассматривается как одномерный. Например, массив:
int B [3] [2] [4] – трактуется как одномерный массив из трех элементов - двумерных массивов (матриц) int [2] [4], с именами B[0], B[1], B[2], каждый из этих массивов трактуется как одномерный массив, состоящий из двух одномерных массивов (векторов) int [4].
Располагаются элементы массива в ОП естественно одномерно: сначала располагаются все элементы первой матрицы, как было описано выше, затем второй и третьей.
При определении, например, трехмерного массива инициализация его элементов может проводиться либо с учетом внутренней структуры массива, отделяя двумерные и одномерные массивы фигурными скобками, либо списком значений в соответствии с расположением элементов в оперативной памяти:
int B [ 3 ] [ 2 ] [ 4] = { { {1, 2, 3, 4}, {5, 6, 7, 8} },
{ {9, 10, 11, 12}, {13, 14, 15, 16} },
{ {17, 18, 19, 20}, {21, 22, 23, 24} } };
эквивалентно:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 23, 24 };
Инициализации символьных массивов
Для инициализации символьных массивов чаще всего используются строки.
Инициация символьного массива может быть выполнена значением строковой константы, например, следующим образом:
сhar stroka [10] = ''строка'';
При такой инициализации компилятор запишет в память символы строковой константы и добавит в конце двоичный ноль '\0’, при этом памяти будет выделено с запасом (10 байт).
Можно объявлять символьный массив без указания его длины:
char stroka1 [ ] = ''строка'';
Компилятор, выделяя память для массива, определит его длину, которая в данном случае будет равна 7 байтов (6 байтов под собственно строку и один байт под завершающий нуль).
Инициализация двумерных символьных массивов проводится следующим образом:
сhar name [5] [18] = {''Иванов'', ''Петров'', ''Розенбаум'', ''Цой'', ''Григорьев''};
При объявлении символьного массива будет выделено памяти по 18 байтов на каждую строку, в которые будут записаны символы строки и в конце каждой строки добавлен байтовый ноль, всего 90 байтов.
При таком объявлении в массиве остается много пустого места.
При определении многомерных массивов с инициализаций (в том числе и двумерных) значение первого индекса в квадратных скобках можно опускать.
Количество элементов массива по первому измерению компилятор определит из списка инициализации.
Например, при определении:
char sh [ ] [40] = {''===================================='',
''| F | F | F | F | F |'',
''====================================''
};
компилятор определит три строки массива по 40 элементов каждая, причем sh[0], sh[1], sh[2] – адреса этих строк массива в оперативной памяти.
В каждую из строк будет записана строковая константа из списка инициализации.
Форма обращения к элементам массивов
С помощью операции [] (квадратные скобки) обеспечивается доступ к произвольному элементу массива.
Обращение к элементу одномерного массива имеет вид:
имя массива [индекс],
где индекс – это не номер элемента, а его смещение относительно первого элемента с индексом 0. Пример:
int A[10]; A[5] = 0; //A[5] – обращение к шестому элементу массива.
Для обращения к элементам многомерного массива также используется имя массива, после которого в квадратных скобках стоит столько индексов, сколько измерений в массиве.
Пример обращения к элементу двумерного массива:
имя массива [ i ][ j ],
- это обращение к элементу i –ой строки и j-го столбца двумерного массива.
