Указатели и адреса объектов


Как было показано ранее, переменные и константы различных типов данных – это объекты, которые размещаются в памяти компьютера по определенному адресу и, начиная с этого адреса, занимающие в памяти в зависимости от типа определенное количество байт (см. табл. Типов). В языке Си++ определена унарная операция & (получения адреса), которая при применении к конкретному объекту (например, &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; просмотров: 440;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.