What does 'dereferencing' a pointer mean in C/C++?
Categories:
Understanding Dereferencing Pointers in C/C++

Explore the fundamental concept of dereferencing pointers in C and C++, including what it means, how it works, and common use cases.
In C and C++, pointers are powerful variables that store memory addresses. While a pointer itself holds an address, the real value often lies at the location that address points to. This act of accessing the value stored at the memory address held by a pointer is known as dereferencing.
What is a Pointer?
Before diving into dereferencing, let's quickly recap what a pointer is. A pointer is a variable whose value is the memory address of another variable. Instead of storing a direct value (like an integer or a character), it stores the location where that value can be found in the computer's memory. Think of it like a house number; the pointer is the number, and the house itself contains the actual data.
int myVariable = 10;
int* ptr = &myVariable; // ptr now holds the memory address of myVariable
Declaring a variable and a pointer to it
The Dereference Operator (*)
The dereference operator, denoted by an asterisk (*
), is used to access the value stored at the memory address pointed to by a pointer. When you apply the *
operator to a pointer variable, it 'dereferences' the pointer, giving you the content of the memory location it points to. This allows you to read or modify the original variable indirectly through its pointer.
flowchart TD A[Variable 'myVariable' (Value: 10)] B[Pointer 'ptr' (Address: 0x1234)] C[Memory Location 0x1234 (Contains: 10)] B -- "stores address of" --> C C -- "is the value of" --> A B -- "dereferences to" --> A subgraph Dereferencing D["*ptr" (Accesses value at 0x1234)] end D --> A
Conceptual flow of a pointer and dereferencing
int myVariable = 10;
int* ptr = &myVariable; // ptr stores the address of myVariable
std::cout << "Value of myVariable: " << myVariable << std::endl; // Output: 10
std::cout << "Address stored in ptr: " << ptr << std::endl; // Output: 0x7ffee... (an address)
std::cout << "Value at address pointed by ptr (*ptr): " << *ptr << std::endl; // Output: 10
*ptr = 20; // Dereference ptr and assign a new value to myVariable
std::cout << "New value of myVariable: " << myVariable << std::endl; // Output: 20
Demonstrating pointer dereferencing to read and modify values
ptr
gives you the memory address, while *ptr
gives you the value stored at that address. This distinction is crucial for avoiding common pointer errors.Common Use Cases for Dereferencing
Dereferencing is fundamental to many C/C++ programming patterns:
- Accessing dynamically allocated memory: When you allocate memory using
new
ormalloc
, these functions return a pointer to the newly allocated block. You must dereference this pointer to store data in or retrieve data from that memory. - Passing arguments by reference: While C++ has reference types, in C (and often in C++ for specific scenarios), passing a pointer to a function allows the function to modify the original variable outside its scope by dereferencing the pointer.
- Working with arrays: Array names often decay into pointers to their first element. Dereferencing can be used to access individual elements.
- Implementing data structures: Linked lists, trees, and graphs heavily rely on pointers and dereferencing to navigate between nodes.
// Example: Dynamic memory allocation and dereferencing
int* dynamicInt = new int; // Allocate memory for an int
*dynamicInt = 100; // Dereference to store value
std::cout << "Dynamic value: " << *dynamicInt << std::endl; // Dereference to retrieve value
delete dynamicInt; // Free allocated memory
// Example: Passing by pointer to modify a variable
void increment(int* numPtr) {
(*numPtr)++; // Dereference to access and increment the original value
}
int x = 5;
increment(&x);
std::cout << "Incremented x: " << x << std::endl; // Output: 6
Practical examples of dereferencing in dynamic memory and function calls
nullptr
or an uninitialized pointer leads to undefined behavior, often resulting in a segmentation fault or program crash. Always ensure your pointers are valid and point to allocated memory before dereferencing.