Производные типы
Выше были рассмотрены фундаментальные (встроенные) типы данных а
также составные типы. Язык предоставляет пользователю производные типы
данных, такие как указатели, ссылки, и константы.
27
Указатели (pointers)
Объект является типизированной областью памяти. Функции при этом
объектами не являются несмотря на то, что они также как и объекты могут
занимать память. В C++ фундаментальной единицей хранения является байт,
состоящий из последовательности бит, числокоторых определяется
реализацией. Да, их в байте может быть не восемь, хотя это большая редкость.
Каждый байт имеет уникальный адрес. Указатель хранит адрес байта с
которого начинается типизированная память. Указатель однозначно связан с
типом, который хранится по этому адресу. Указатели объявляются путем
добавления символа '*' к идентификаатору.
double *x;
// неинициализированный указатель на double
double* y;
// то же самое. и не важно, где стоит '*' но минимум один
//
пробел нужен между идентификатором и типом;
A *pa;
// укаазатель на объект
A* pa, *pb
; // два указателя на объекты одного типа
Физически указатель представляет собой адрес памяти. Для 32-битных
архитектур процессоров размер адреса как правило составляет 32 бита.
Проверьте в своей среде разработки сами:
cout << sizeof(A*)<
; // размер в байтах!
Инициализация указателей
A a;
// определение объекта с выделением памяти
A*pa = {&a}; // '&' -
оператор взятия адреса объекта
A *pb=new A; //
создание нового объекта в динамической памяти
A *pc{nullptr
}; // инициализация указателем-литераом
Чтение значения по указателю
double x{3.14};
// определение и инициализация 'x'
double *px{&x}; // '*' -
указывает на то, что 'px' это указатель;
// '&' -
оператор взятия адреса
cout << *px << endl;
// вне определения оператор '*', разыменование
//
указателя, означает объект, на который укаазатель
//
ссылается. Результат: 3.14
Запись в память по указателю
double x, *px{&x};
// объявление 'x' и там же объявление указателя на него
*px = 3.14;
// "разыменование" указателя и запись по адресу на
//
который он указывает
cout << x << endl; // 3.14
Арифметика указателей для работы с указателями возможно
использование операторов сложения, вычитания и сравнения.
if (pa != pb
) // копирование объектов только если адреса разные
*pa=pb;
while(*pa++ = *pb++); //
копирование массива 'pb' в массив 'pa' до первого
//
нулевого элемента
28
Do'stlaringiz bilan baham: |