Лекция 10. Общие понятия. Типы указателей. Управляемые и неуправляемые указатели. Указатели на функцию. Примеры использования


void *ptr; сообщает о том, что ptr



жүктеу 112.88 Kb.
бет7/12
Дата10.11.2022
өлшемі112.88 Kb.
#23641
түріЛекция
1   2   3   4   5   6   7   8   9   ...   12
Лекция 10
11 лекция
void *ptr;

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


К указателю void операцию размывания применять нельзя; если известно, на что на самом деле он указывает, нужно воспользоваться операцией преобразования типов для превращения его в обычный указатель. Например, если указатель p определен при помощи void *p; но в определенном месте программы известно, что он указывает на целое число, до этого целого числа можно добраться, написав *(int *)p. При этом, разумеется, компилятор никак не может проверить, что этот указатель действительно указывает на переменную типа целое число, а не вещественное; он не может проверить даже того, что этот указатель вообще указывает на какую-либо переменную, а не на пустую или даже недоступную программе область памяти.


10.3.5. Функция malloc()
Примером указателя типа void может служить функция malloc(), возвращающая указатель на динамическую область памяти, выделяемую ею под объект. Она возвращает указатель типа void, и пользователь должен сделать приведение (casting) этого типа к типу объекта методом принудительного назначения типа (в скобках указать тип).
Если, например, мы выделяли память под объект типа char, то надо объявлять:

char object[];


char *P=(char *)malloc(sizeof(object));

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


Объявление такого указателя по определению будет выглядеть так:


char *Pc;

Здесь имя указателя — Pc, а не *Pc. Сам указатель — это переменная Pc.


Теперь воздействуем на него операцией разыменования. Получим *Pc. Это будет значение первого символа строки, на начало которой указывал указатель. Чтобы получить значение следующего символа строки, надо указатель увеличить на единицу: Pc++ и применить *(Pc++).
Вообще, какого бы типа не был объект, на начало которого в памяти указывает некоторый указатель Р (а он указывает именно на начало объекта в памяти, когда говорят, что он указывает на объект), Р++ всегда указывает на следующий элемент объекта, P+i — на i-й элемент. Приращение адреса, который содержит указатель Р, всегда сопровождается масштабированием размера памяти, занимаемого элементом объекта. То есть указатель при увеличении его значения на единицу передвигается на величину, равную длине элемента объекта, устанавливаясь на начало следующего элемента объекта.



жүктеу 112.88 Kb.

Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7   8   9   ...   12




©emirb.org 2022
әкімшілігінің қараңыз

    Басты бет