- •Адреса, указатели, ссылки, массивы Указатели и адреса объектов
- •Объявление и инициализация указателей
- •Инициализация указателей
- •Указатели константы и на константы
- •Типы указателей и операции над ними
- •Указатели на основные типы данных - на арифметические данные и на символьные.
- •Операции над указателями
- •Понятие указателя на указатель
- •Аддитивные операции
- •I. Вычитание
- •Вычитание из указателя целое число:
- •II. Сложение указателя с целым значением
- •Объявление ссылки
- •Инициализация ссылок не обязательна:
- •Массивы
- •Форма объявления одномерного массива (вектора) type имя массива [k];
- •Type имя массива [ k 1] [ k2] …[kn];
- •Внутреннее представление массивов в оперативной памяти
- •Инициализация числовых и символьных массивов.
- •Инициализации символьных массивов
- •Массивы и указатели
- •Указатели и строки
- •Ввод/вывод элементов массивов Ввод/вывод числовых массивов
- •Ввод/вывод символьных массивов
- •Создание динамических массивов.
- •Имя указателя [индекс элемента]
- •Массивы указателей
- •Создание двумерного динамического массива с помощью динамического массива указателей.
- •Указатель на массив. Многомерные массивы динамической памяти.
- •Определение типа массива
- •Определение типа указателя на массив
Указатель на массив. Многомерные массивы динамической памяти.
Указатель на массив – это переменная, значением которой является адрес массива. Этому указателю доступен участок памяти, выделенный под массив.
При прибавлении к такому указателю 1 получается значение адреса, большее на размер массива.
Определение указателя на массив рассмотрим на примере определения указателя ptr на массив из 6 элементов типа int:
int (*ptr) [6];
Выражение:
(long)(ptr+1) - (long) ptr == 24(байтов)
возвращает размер массива в байтах, на который ''указывает'' указатель ptr.
Многомерный динамический массив можно определить следующим образом:
new тип массива,
где тип массива – это тип элементов массива и нужное количество квадратных скобок, с константными выражениями, определяющие размеры массива.
При таком определении существуют следующие правила:
при выделении памяти для динамического массива его размеры должны быть полностью определены.
нельзя явно инициализировать массив при динамическом выделении памяти.
Определим трехмерный динамический массив типа int [3][2][4],
Этот массив состоит из трех подмассивов - матриц 2х4.
Определим указатель на подмассив – матрицу элементов типа int размером 2х4:
int (*p) [2] [4];
C помощью операции new выделяется участок памяти для трех матриц, причем операция возвращает адрес первой матрицы массива, который и присваивается указателю p:
p = new int [3] [2 ] [4 ]
– выделена память для массива 3x2x4 типа int
Чтобы освободить память, выделенную на массив, используем оператор:
delete [ ] p;
Формы обращения к элементам массива:
p[i][j][k],либо*(*(*(p+i)+j)+k).
В операторе:
cout<< (long) (p+1) – (long) p; //32
- размер участка памяти, на который ''указывает'' указатель p.
Определение типа массива
Определение имеет следующий вид:
Typedef type имя_типа_элем_массива [k1] [k2] ..[kn];
Пример:
Typedef array float [3][5][2];
array– имя типа массива 3х5х2 с элементами типа float
array Mas; - определен массив Mas типа array.
Определение типа указателя на массив
Определение имеет следующий вид:
typedef type (*имя_типа_указателя_на_массив) [k1] [k2] ..[kn];
Пример: typedef float (*tpm) [5][2];
tpm– имя типа указателя на массив 5х2 с элементами типа float
tpm pm ; - объявлен указатель такого типа
