Операции над указателями

Типизированные и нетипизированные указатели

Приведение типов

Обзор

Указатели

Метки

Идентификатор с последующим двоеточием является меткой. Метка является адресом оператора, следующего за меткой. Используется в операторах switch и goto.

Переменные хранят данные и не позволяют управлять их размещением в памяти. Единственная доступная операция – взятие адреса (&).

Указатель на переменную хранит адрес размещения данного. Обратиться к данному можно через операцию разыменовывания указателя (*). Объявление указателя осуществляется символом «*» перед именем переменной. Пример:

int x;

int *t; // объявили указатель t на переменную типа int

t = &x; // присваиваем указателю адрес переменной x

*t = 4; // используя указатель, присваиваем x значение 4

Указатели и объекты одного типа могут быть объявлены вместе. Пример (другая раелизация предыдущего примера):

int x,*t=&x;

Константа NULL предназначена для обозначения неинициализированных указателей.

В языке «C» простые типы данных автоматически приводятся к требуемому. Вещественные преобразуются к целым путём отсечения дробной части. Данные большего размера приводятся к данным меньшего размера отбрасыванием старших байт. Для более сложных типов данных, а также для указателей требуется явное преобразование типов. Операция преобразования типа имеет вид:

(новый_тип)переменная

При этом для объектов (экземпляров классов и структур) операция приведения должна быть определена. Для указателей допустимо приведение к другому указателю. Приведение указателей никак не преобразует сами данные.

Примеры приведены далее.

Рассмотренные указатели являются типизированными, т.е. могут указывать только на заданный тип данных.

Существуют также нетипизированные указатели (void*), способные указывать на любой тип данных. Сохранение размера и типа данного возложено на программиста.

Пример:

int x;

float y;

void *t = &x; //допустимо

*t = 5; // операция НЕДОПУСТИМА, т.к. неизвестен тип данного

*(int *)t = 5; //допустимо обращение при соответствующем приведении типов

t =& y;

*(double*)t = 2.5;

Для типизированных указателей определены операции сложения с числом и вычитания из них числа, при этом результатом является указатель того же типа, смещенный в памяти на заданное количество данных (т.е. на размер данного, умноженного на заданное смещение).

Также для типизированных указателей определена операция разности указателей. Данная операция возвращает количество элементов (размер_области_памяти/размер_элемента) между указателями.

Пример (будем считать, что sizeof(float) =4):

float *a=1000, *c;

short x;

c = a+10; // c = 1000+10*sizeof(float)=1040

c = c – 4; // c = 1040 – 4*sizeof(float) = 1024

x = c – a; // x = (1024-1000)/sizeof(float) = 6


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: