Pointer is a variable pointing at a memory location of specific type. Type defines many important properties related to the pointer. Such as valid memory addresses it can point, pointer arithmetic, etc.
As per C programming semantics, you must specify pointer type during its declaration. Also, it is illegal to point pointer of one type to object of another type. For example, int pointer cannot point to a float variable.
Type specific pointers are beneficial in different ways. However, in programming there happens situation when you need to go typeless. For example, suppose you are required to design a function that can accept any type value as argument, process data and return results. For such situation, you need a pointer that must work with all types.
What is a void pointer?
A void pointer is a special pointer that can point to object of any type. A void pointer is typeless pointer also known as generic pointer. void pointer is an approach towards generic functions and generic programming in C.
Note: Writing programs without being constrained by data type is known as generic programming. A generic function is a special function that focuses on logic without confining to data type. For example, logic to insert values in array is common for all types and hence can be transformed to generic function.
Syntax to declare void pointer
void * pointer-name;Example to declare void pointer
void * vPtr;How to dereference a void pointer
Dereferencing is the process of retrieving data from memory location pointed by a pointer. It converts block of raw memory bytes to a meaningful data (data is meaningful if type is associated).
While dereferencing a void pointer, the C compiler does not have any clue about type of value pointed by the void pointer. Hence, dereferencing a void pointer is illegal in C. But, a pointer will become useless if you cannot dereference it back.
To dereference a void pointer you must typecast it to a valid pointer type.
Example to dereference a void pointer
int num = 10;
void * vPtr = # // void pointer pointing at num
int value = *((int *) vPtr); // Dereferencing void pointervoid pointer arithmetic
void pointer arithmetic is illegal in C programming, due to the absence of type. However, some compiler supports void pointer arithmetic by assuming it as a char pointer.
To perform pointer arithmetic on void pointer you must first typecast to other type.
Example of void pointer arithmetic
int arr[] = {10, 20, 30, 40, 50};
void * vPtr = &arr; // void pointer pointing at arr
vPtr = ((int *) vPtr + 1); // add 1 to void pointerExample program to use void pointer
Write a C function to accept an array and print its elements. The function must accept array of different types.
/**
* C program to demonstrate void pointer
*/
#include <stdio.h>
#define SIZE 10
/* Function declaration */
void printArray(void * vPtr, int size, int type);
int main()
{
int num[SIZE] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
float fractional[SIZE] = {1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f};
char characters[SIZE] = {'C', 'o', 'd', 'e', 'f', 'o', 'r', 'w', 'i', 'n'};
printf("\nElements of integer array: ");
printArray(&num, SIZE, 1);
printf("\nElements of float array: ");
printArray(&fractional, SIZE, 2);
printf("\nElements of character array: ");
printArray(&characters, SIZE, 3);
return 0;
}
/**
* Function to print array of different types.
*
* @vPtr Pointer to an array
* @size Size of the array
* @type Integer value specifying type of array.
* 1 - Integer,
* 2 - Float,
* 3 - Character
*/
void printArray(void * vPtr, int size, int type)
{
int i;
for(i=0; i<size; i++)
{
// Print array elements based on their type
switch(type)
{
case 1:
/* Typecast void pointer to integer then print */
printf("%d, ", *((int *)vPtr + i));
break;
case 2:
/* Typecast void pointer to float then print */
printf("%f, ", *((float *)vPtr + i));
break;
case 3:
/* Typecast void pointer to char then print */
printf("%c, ", *((char *)vPtr + i));
break;
}
}
}Output
Elements of integer array: 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
Elements of float array: 1.100000, 1.200000, 1.300000, 1.400000, 1.500000, 1.600000, 1.700000, 1.800000, 1.900000, 2.000000,
Elements of character array: C, o, d, e, f, o, r, w, i, n,