void* universal pointer can also be used as a function argument.
Below example transferValues function declares two void* arguments.
Instead of writing two different functions for int and double types only one transferValues function with void* arguments can be used.
void* seems to be usable but there are type-safety related problems with void pointer.
With a suitable casting operation existing void* universal pointer can be converted to an appropriate type.
Because a void pointer can not be dereferenced directly, static_cast can be used to cast from void* to another type.
Following error message is generated by the compiler if a void* is dereferenced before casting to an appropriate type.
'void*' is not a pointer-to-object type
Example void pointer project compiled with : g++ (Ubuntu 4.9.2-10ubuntu13) 4.9.2
#include <iostream>
using namespace std;
enum ParamType
{
intType,
doubleType
};
void transferValues( void* from, void* to, int size, ParamType pType)
{
if( pType == intType )
{
for (int i= 0; i<size; i++)
{
static_cast<int*>(to)[i] = static_cast<int*>(from)[i];
}
}
else if( pType == doubleType )
{
for (int i= 0; i<size; i++)
{
static_cast<double*>(to)[i] = static_cast<double*>(from)[i];
}
}
}
int main()
{
int val = 5;
void* vPtr = &val;
// below line generates compile error
// cout << *vPtr;
int* newVal = static_cast<int*>(vPtr);
cout << *newVal << endl;
double dVal = 5.2;
vPtr = &dVal;
double* newDVal = static_cast<double*>(vPtr);
cout << *newDVal << endl;
char cVal = 'c';
vPtr = &cVal;
char* newCVal = static_cast<char*>(vPtr);
cout << *newCVal;
cout << endl << endl;
int a[5] = { 1, 2, 1, 1, 1 };
int b[5];
cout << "Elements of array a = ";
for( int i = 0; i<5; i++ )
cout << a[i] << " ";
cout << endl << "Elements of array b before casting = ";
for( int i = 0; i<5; i++ )
cout << b[i] << " ";
transferValues( a, b, 5, intType );
cout << endl << "Elements of array b after casting = ";
for( int i = 0; i<5; i++ )
cout << b[i] << " ";
double c[5] = { 2.3, 3.3, 4.3, 5.3, 6.3 };
double d[5];
cout << endl << endl << "Elements of array c = ";
for( int i = 0; i<5; i++ )
cout << c[i] << " ";
cout << endl <<"Elements of array d before casting = ";
for( int i = 0; i<5; i++ )
cout << d[i] << " ";
transferValues( c, d, 5, doubleType );
cout << endl << "Elements of array d after casting = ";
for( int i = 0; i<5; i++ )
cout << d[i] << " ";
cout << endl << endl;
return 0;
}
After running the program following terminal output displayed.






