Указатели и адреса объектов
Как было показано ранее, переменные и константы различных типов данных – это объекты, которые размещаются в памяти компьютера по определенному адресу и, начиная с этого адреса, занимающие в памяти в зависимости от типа определенное количество байт (см. табл. Типов). В языке Си++ определена унарная операция & (получения адреса), которая при применении к конкретному объекту (например, &A) вернет значение адреса, начиная с которого этот объект (А) размещается в памяти компьютера. Адрес любого объекта - это в большинстве случаев беззнаковое 4-х байтовое число, для использования и хранения которого в языке определен специальный тип данных – указатели. Таким образом, значением указателя является адрес объекта в памяти. Поэтому говорят, что указатель, который хранит адрес конкретного объекта, указывает или настроен на этот конкретный объект.
Кроме адреса, указатель должен также хранить информацию о типе объекта, который размещен в памяти, начиная с этого адреса. Это необходимо для того, чтобы при доступе с помощью указателя к объекту, знать сколько байт отведено под этот объект и как данные в этих байтах интерпретировать. Поэтому для сохранения этой информации при определении указателя задаётся его тип и в дальнейшем он может быть настроен только на объект того же самого типа. Таким образом, если в языке Си++ можно определить объект встроенного или определенного пользователем типа данных, то, следовательно, можно определить и указатель такого же типа.
Определить указатель в программе можно c помощью выражения вида:
type * имя_указателя инициализатор;
где type – обозначение типа; имя_указателя – идентификатор указателя, задаётся программистом; инициализатор – не обязательное инициализирующее выражение. Как упоминалось, инициализатор имеет две формы:
type * имя_указателя = инициализирующее_выражение;
type * имя_указателя (инициализатор_выражение);
В качестве инициализирующего выражения должно использоваться константное выражение, частными случаями которого являются:
явно заданный адрес участка памяти;
указатель уже имеющий значение;
выражение, позволяющее получить адрес объекта с помощью операции &.
Пример:
int a = 1, b = 2; /* Определение и инициализация двух переменных a, b типа int */
int * pi1 , *pi2 = &a; /*Определение двух указателей pi1, pi2 типа int*, причем под указатель pi1 выделяется память, но он не инициализируется. Указатель pi2 инициализируется адресом переменной a, т.е. pi2 настроен на переменную а. */
double k , f; //определение двух переменных k и f типа double
double * pd1 = &k, * pd2 = (double*) 0x8D8F0FFA; /*определение и инициализация указателя pd1 и pd2 типа double*; pd1 настраивается на переменную k, а pd2 инициализируется константой 0x8D8F0FFA, причём операция преобразования типа (double*) используется для того, чтобы сообщить компилятору что эта константа не типа long, а адрес в памяти на объект типа double. */
double * pd3 = pd1; /*определен и инициализирован значением указателя pd1, указателя pd3, т.е. pd3, как и pd1, содержит адрес переменной k и теперь на переменную k настроено два указателя.*/
Дата добавления: 2020-12-11; просмотров: 431;