void pointer in C / C++

A void pointer is a pointer that has no associated data type with it. A void pointer can hold address of any type and can be typcasted to any type.

filter_none

edit
close

play_arrow

link
brightness_4
code

int a = 10;
char b = 'x';
  
void *p = &a;  // void pointer holds address of int 'a'
p = &b; // void pointer holds address of char 'b'

chevron_right


Advantages of void pointers:
1) malloc() and calloc() return void * type and this allows these functions to be used to allocate memory of any data type (just because of void *)

filter_none

edit
close

play_arrow

link
brightness_4
code

int main(void)
{
    // Note that malloc() returns void * which can be 
    // typecasted to any type like int *, char *, ..
    int *x = malloc(sizeof(int) * n);
}

chevron_right


Note that the above program compiles in C, but doesn’t compile in C++. In C++, we must explicitly typecast return value of malloc to (int *).

2) void pointers in C are used to implement generic functions in C. For example compare function which is used in qsort().

Some Interesting Facts:
1) void pointers cannot be dereferenced. For example the following program doesn’t compile.



filter_none

edit
close

play_arrow

link
brightness_4
code

#include<stdio.h>
int main()
{
    int a = 10;
    void *ptr = &a;
    printf("%d", *ptr);
    return 0;
}

chevron_right


Output:

Compiler Error: 'void*' is not a pointer-to-object type 

The following program compiles and runs fine.

filter_none

edit
close

play_arrow

link
brightness_4
code

#include<stdio.h>
int main()
{
    int a = 10;
    void *ptr = &a;
    printf("%d", *(int *)ptr);
    return 0;
}

chevron_right


Output:

10

2) The C standard doesn’t allow pointer arithmetic with void pointers. However, in GNU C it is allowed by considering the size of void is 1. For example the following program compiles and runs fine in gcc.

filter_none

edit
close

play_arrow

link
brightness_4
code

#include<stdio.h>
int main()
{
    int a[2] = {1, 2};
    void *ptr = &a;
    ptr = ptr + sizeof(int);
    printf("%d", *(int *)ptr);
    return 0;
}

chevron_right


Output:

2

Note that the above program may not work in other compilers.

References:
http://stackoverflow.com/questions/20967868/should-the-compiler-warn-on-pointer-arithmetic-with-a-void-pointer
http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Article Tags :
Practice Tags :


32


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.