your image

void pointer in C / C++ - GeeksforGeeks

GeeksforGeeks
greeksforgeeks
Related Topic
:- programming skills

void pointer in C / C++

  • Difficulty Level : Easy
  • Last Updated : 03 Jan, 2019

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.

Take a step-up from those "Hello World" programs. Learn to implement data structures like Heap, Stacks, Linked List and many more! Check out our Data Structures in C course to start learning today.

 

 

 

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'

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 *)

 

 

 

int main(void)

{

    // Note that malloc() returns void * which can be 

    // typecasted to any type like int *, char *, ..

    int *x = malloc(sizeof(int) * n);

}

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.

 

 

 

#include<stdio.h>

int main()

{

    int a = 10;

    void *ptr = &a;

    printf("%d", *ptr);

    return 0;

}

Output:

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

The following program compiles and runs fine.

 

 

 

#include<stdio.h>

int main()

{

    int a = 10;

    void *ptr = &a;

    printf("%d", *(int *)ptr);

    return 0;

}

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.

 

 

 

#include<stdio.h>

int main()

{

    int a[2] = {1, 2};

    void *ptr = &a;

    ptr = ptr + sizeof(int);

    printf("%d", *(int *)ptr);

    return 0;

}

Output:

2

Comments