program - void pointer in c++




When to use a void pointer? (9)

void * is really a C-ism, and allows C to do some things that it could not reasonably do otherwise.

char * cannot portably be used for anything, as different platforms can make different types of pointers - a char * isn't necessarily handled the same (or is even the same size) as a void *.

So when the type of data isn't known in C (or is polymorphic or otherwise dynamic), then void * allows you to generate the correct underlying pointer type - one that can point to anything correctly.

In C++ void * generally should never come up except in the context of interfacing with legacy C code in one form or another.

I understand the use of void pointer for malloc implementation.

void* malloc  ( size_t size );

Can anyone suggest other reasons or provide some scenarios where it is useful in practice.

Thanks


void pointers should be used any time the contents of a block of data is not important. For example when copying data the contents of a memory area is copied but the format of the data is not important.

For functions that operate on blocks of memory without needing to understand the contents using void pointers clarifies the design to users so that they know the function does not care for any data format. Often functions a coded to take a char * to handle blocks of memory when the function is actually content agnostic.


Another example of such C "generics", implemented with void *, is a standard qsort function:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

You can sort an array of any type: int, long, double, char * or some struct pointers...


If you are interfacing with C code and need to pass through a C++ object, but a C library will only take a generic pointer, then when you retrieve the pointer you need to re-cast it to the proper type.

Void pointers probably shouldn't be used very often, but they can help when you're trying to use a library function that works with arbitrary pointers, and doesn't really care what data is represented by that memory.


It is commonly used in numerical code, for example a C root solver function might look like that:

double find_root(double x0, double (*f)(double, void*), void* params)
{
/* stuff */
y = f(x, params);
/* other stuff */
}

params is cast by f to some structure it knows about, but find_root doesn't.


Look at sqlite3_exec(). You start an SQL query and want to process the results in some way (store them into a container). You call the sqlite3_exec() and pass a callback pointer and a void* pointer to whatever object you want (container included). When sqlite3_exec() runs it calls the callback for each retrieved row and passed that void* pointer into it so the callback can cast the pointer and do whatever you intended.

The important thing is that sqlite3_exec() doesn't care what the callback does and what pointer you pass. void* is exactly for such pointers.


One good scenario void* use is when you want to implement any generic ADT's, in case you just don't know what datatype it going to keep and deal with. For example, a linked list like the following:

typedef struct node_t node;
struct
{
    void* data;
    node* prev, next;
} node_t;

typedef struct list_t list;
typedef void* (func)(void*) cpy_func;
typedef void (func)(void*) del_func;
struct
{
   node* head, tail, curr;
   cpy_func copy;
   del_func delete;
} list_t;

initializeLinkedList(cpy_func cpy, del_func del);
//here you keep going defining an API

Here for example you will pass in initialization function pointers to other functions which will be capable of copying your datatype to your list and freeing it afterwards. So by using void* you make your list more generic.

I think void* remained in C++ only because of backward compatibility, since in C++ you have more safe and sophisticated ways to achieve the same result like templates, functors, etc., and you don't need to use malloc while programming C++.

Regarding C++, I don't have any specific useful examples.


There is great advantage of using void pointer . Pointer variable is an variable which stores the address of another variable. example:

int a;
int *x= &a;

Now 'x' stores the address of the integer variable.

But this one fails:

float f;
int *x = &f;

Because Integer pointer variable can store only integer variable address. in same manner it applies for other data types.

When you use void * pointer , it gives an edge to store address of any TYPE variable.

void *pointer = &i;
void *pointer = &f;

while retrieving it has to be deferenced.

*((int*)pointer)

So, carefully make use of void pointer.

This might help you, Thank You.


int (*f) (void);
f =(void*) getprocaddress(dll,"myfunction");

to make the compiler happy





pointers