Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.doc
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
440.83 Кб
Скачать

22) Указательные переменные. Операции получения адреса (&) и раскрытие ссылка (*) (в1б22, в3б7)

Указательные переменные

Указатель – это переменная, которая содержит адрес некоторого объекта.

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

Время жизни динамических переменных – от точки создания до конца программы или до явного освобождения памяти.

В С различают 3 вида указателей:

– указатели на объект;

– указатели на функцию;

– указатели на void, отличающиеся свойствами и набором допустимых операций.

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

тип(*имя)(список типов аргументов);

Пример:

int (*fun)(double, double);

задает указатель с именем fun на функцию, возвращающую значение типа int и имеющую 2 аргумента типа double.

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа.

тип *имя;

В этом объявлении тип – некоторый тип языка С, определяющий тип объекта, на который указывает указатель (адрес которого содержит). * – следующая за ней переменная является указателем. Она относится непосредственно к имени, поэтому для того, чтобы объявить несколько указателей, требуется вставить ее перед именем каждого из них.

Пример:

int *a, b, *c;

Описываются 2 указателя на целое с именами а и с, а также целая переменная b.

Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, неопределен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов). Однако для того, чтобы можно было

выполнить арифметические и логические операции над указателями или над объектами, на которые они указывают, необходимо при выполнении каждой операции явно определить тип объекта. Такие определения типов могут быть выполнены с помощью операции приведения типов. Указателю на void можно присвоить указатель любого другого типа. Однако при обратном присваивании необходимо использовать явные преобразования указателя на void.

Пример:

void *p1; // объявление указателя на тип void

float f, *p2; // объявление указателя на тип float (p2) и переменной того же типа (f)

p2 = &f; // указатель p2 теперь указывает на f (они имеют один и тот же адрес)

p1 = p2; // присваивание указателю void указателя типа float

p2 = (float *)p1; /* обратное присваивание: указателю p2 присваивается указатель p1, предварительно преобразовав p1 к типу float */

Операции получения адреса (&) и раскрытия ссылки (*)

С указателями связаны 2 специальные операции: & и *. Обе эти операции являются унарными, т.е. имеют один операнд, перед которые они ставятся.

Операция & соответствует операции "взять адрес"; операция * соответствует словам "значение, расположенное по указанному адресу".

В объявлении переменной, являющейся указателем, очень важен базовый тип. Компилятор знает, сколько байт памяти занимает переменная, на которую указывает данный указатель из базового типа указателей. Если указатель имеет базовый тип int, то переменная занимает 2 байта, char – 1 байт и т.д.

Пример:

// работа с указателями

{

float x = 10.1, y; // объявление с инициализацией x и y

float *point; // объявление указателя point на тип float

point = &x; // применение операции взятия адреса; теперь указатель point указывает на x

y = *point; /* применение операции взятия значения, расположенному по адресу, на который указывает point; теперь y содержит значение x (т.к. point указывал на x */

printf ("x = %d", x , "y = %d", y); // вывод значения x и y (они одинаковы)

++ *point; /* увеличение на единицу значения, расположенного по адресу, на который указывает указатель point */

printf ("\n x = %d", x, "y = %d", y); /* теперь значение x увеличено на единицу, а y – без изменения */

y = 1+ *point*y; // сумма единицы и значения указателя point * на значение переменной y

printf("\n x = %d", x, "y = %d", y); // вывод значений x и y

getch(); }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]