Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Максимов_электронный_учебник_текст.doc
Скачиваний:
42
Добавлен:
01.06.2015
Размер:
3.24 Mб
Скачать

5.3. Свойства указателя типа void*

Тип void (пустота, пробел) является основным типом языка программирования Си++, но в отличие от других основных типов с помощью ключевого слова void нельзя создать объект типа void. В основном ключевое слово voidиспользуется для того, чтобы указать на отсутствие параметров функции и/или возвращаемого функцией значения. Например:

void printStr(void){ cout<<“Здравствуй Мир!!”;}

Эта функция не принимает никаких параметров и не возвращает никакого значения.

Указатель типа void* это четырехбайтовый объект, предназначенный для хранения адреса любого типа объектов или адреса фрагмента памяти, т.е. он может указывать на всё что угодно. С этим указателем не связывается информация о том, какой объект находится в памяти, начиная с записанного в нем адреса. Именно поэтому нельзя применить к указателю типа void* операцию доступа по адресу (*). У компилятора нет информации, сколько байт отведено под объект, на который указывает указатель типа void*, и как информацию в этих байтах интерпретировать. Указатель типа void* единственный тип указателя, для которого определено преобразование типа по умолчанию. Пример:

void* buf; //Определение указателя buf типа void*.

inta= 5;

doublek= 5.5;

buf = &a; /*Преобразование типа по умолчанию. На самом деле выполняется выражение buf = (void*)&a; компилятор по умолчанию добавляет (void*). В buf записывается адрес переменной а. И теперь только программист знает, что buf указывает на объект типа int. */

cout<<*buf; /*ошибка, операция разыменования не определена над указателями типа void*/

cout<<(*(int*) buf); /*Явное преобразование типа. Создаётся неименованный указатель типа int, который инициализируется адресом, хранящимся в buf. К неименованному указателю int* применяется операция разыменования и на экране печатается значение переменной a.*/

buf = &k; /*Преобразование типа по умолчанию. В buf записывается адрес переменной k.*/

cout<<*(double*)buf;//На экране печатается значение переменной k.

cout<<*(int*) buf; /*На экране печатается неизвестно, что, так как buf в данный момент указывает на объект типа double, а не на объект типа int.*/

double * pd; // определение указателя pd типа double*

pd = buf; /*Ошибка. Операция неявного преобразования типа над указателями типа double* не определена. Компилятор выдаст сообщение «Не могу переконвертировать void* в double*.*/

pd= (double*)buf;//Ошибки нет. Явное преобразование типа.

cout<< *pd; //Печать значения переменной k

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

Таблица 5.1

Способы определения указателя

1

type* имя_указателя = инициализатор; ни указатель, ни объект, на который он указывает, константами не являются, их можно изменять

int i = 1;

int* pi = &i;

pi = 2; /* операция разрешена, pi указывает не на константу; pi = pi +1; операция разрешена, pi не константа */

2

type* const имя_указателя = инициализатор; указатель является константой т.е. его нельзя перестроить на другой объект; объект, на который настроен указатель, изменить можно

int i = 1;

int* const pi = &i; *pi = 2;ошибки нет, значение переменной i изменено с помощью указателя pi (i = 2); pi = pi +1; ошибка, значение указателя константа, его изменить нельзя

3

type const* имя_указателя = инициализатор; указатель не является константой; объект, на который настроен указатель, изменить нельзя он константа

int i = 1;

int* const pi = &i; *pi = 2;ошибка, значение переменной i изменить с помощью указателя нельзя; pi = pi +1; операция разрешена pi не константа

4

type const * const имя_указателя = инициализатор; указатель и объект, на который он указывает являются константами их изменить нельзя

int i = 1;

int const* const pi = &i; *pi = 2;ошибка, значение переменной i изменить с помощью указателя нельзя; pi = pi +1; ошибка, pi константа