В этом руководстве мы узнаем об указателях 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;