В этом руководстве мы узнаем об указателях void и о том, как их использовать, с помощью примеров.
Прежде чем продолжить изучение этого руководства, обязательно проверьте указатели C ++.
В C ++ мы не можем присвоить адрес переменной одного типа данных указателю другого типа данных. Рассмотрим этот пример:
// pointer is of int type int *ptr; // variable is of double type double d = 9.0; // Error // can't assign double* to int* ptr = &d;
Здесь ошибка возникла из-за того, что адрес является doubleпеременной типа. Однако указатель имеет intтип.
В таких ситуациях мы можем использовать указатель на void ( указатели на void) в C ++. Например,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Недействительным указатель представляет собой общий указатель , который используется , когда мы не знаем , тип данных переменной , которая указывает указатель на.
Пример 1: указатель на пустоту в C ++
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void ptr = &f; cout << &f << endl; cout << ptr << endl; return 0; )
Вывод
0xffd117ac 0xffd117ac
Здесь указателю ptrприсваивается значение &f.
Выходные данные показывают, что указатель void ptr хранит адрес floatпеременной f.
Как voidи пустой тип, указатели void не могут быть разыменованы.
void* ptr; float* fptr; float f = 2.3; // assign float address to void pointer ptr = &f; cout << *ptr << endl; // Error // assign float address to float pointer fptr = &f; cout << *fptr << endl; // Valid
Пример 2: Печать содержимого указателя пустоты
Чтобы распечатать содержимое указателя void, мы используем static_castоператор. Он преобразует указатель из void*типа в соответствующий тип данных адреса, который хранит указатель:
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void pointer ptr = &f; cout << "The content of pointer is "; // use type casting to print pointer content cout << *(static_cast(ptr)); return 0; )
Вывод
Содержание указателя 2.3.
Эта программа печатает значение адреса, на который указывает voidуказатель ptr.
Поскольку мы не можем разыменовать voidуказатель, мы не можем использовать *ptr.
Однако, если мы преобразуем void*тип указателя в float*тип, мы можем использовать значение, на которое указывает voidуказатель.
В этом примере мы использовали static_castоператор для преобразования типа данных указателя из void*в float*.
C-стиль кастинг
Мы также можем использовать приведение в стиле C для печати значения.
// valid cout << *((float*)ptr);
Однако static_castпредпочтение отдается литью в стиле C.
Примечание: указатели void не могут использоваться для хранения адресов переменных с квалификаторами constили volatile.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;








