Before you proceed with this tutorial, be sure to check C++ pointers.
In C++, we cannot assign the address of a variable of one data type to a pointer of another data type. Consider this example:
// 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;
Here, the error occurred because the address is a double
type variable. However, the pointer is of int
type.
In such situations, we can use the pointer to void (void pointers) in C++. For example,
// void pointer
void *ptr;
double d = 9.0;
// valid code
ptr = &d;
The void pointer is a generic pointer that is used when we don't know the data type of the variable that the pointer points to.
Example 1: C++ Void Pointer
#include <iostream>
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;
}
Output
0xffd117ac 0xffd117ac
Here, the pointer ptr
is given the value of &f
.
The output shows that the void pointer ptr stores the address of a float
variable f.
As void
is an empty type, void pointers cannot be dereferenced.
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
Example 2: Printing the Content of Void Pointer
To print the content of a void pointer, we use the static_cast
operator. It converts the pointer from void*
type to the respective data type of the address the pointer is storing:
#include <iostream>
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<float*>(ptr));
return 0;
}
Output
The content of pointer is 2.3
This program prints the value of the address pointed to by the void
pointer ptr.
Since we cannot dereference a void
pointer, we cannot use *ptr
.
However, if we convert the void*
pointer type to the float*
type, we can use the value pointed to by the void
pointer.
In this example, we have used the static_cast
operator to convert the data type of the pointer from void*
to float*
.
C-style casting
We can also use C-style casting to print the value.
// valid
cout << *((float*)ptr);
However, static_cast
is preferred to C-style casting.
Note: void pointers cannot be used to store addresses of variables with const
or volatile
qualifiers.
void *ptr;
const double d = 9.0;
// Error: invalid conversion from const void* to void*
ptr = &d;