Skip to main content

Pointers in C++

In this guide, we'll explore pointers in C++, a powerful feature that allows you to directly manage memory and perform low-level programming tasks.


1. What is a Pointer?​

A pointer is a variable that stores the memory address of another variable. Pointers are extremely useful for dynamic memory management, passing large data structures to functions, and more.


2. Declaring a Pointer​

To declare a pointer, specify the data type of the variable it will point to, followed by an asterisk *.

Syntax:​

type* pointerName;

Example:​

int* ptr;  // Declares a pointer to an integer

3. Address-of Operator (&)​

The address-of operator & is used to get the memory address of a variable.

Example:​

int num = 5;
int* ptr = # // ptr now holds the address of num

4. Dereferencing a Pointer (*)​

Dereferencing a pointer means accessing the value stored at the memory address the pointer is holding.

Example:​

#include <iostream>
using namespace std;

int main() {
int num = 10;
int* ptr = &num; // Pointer holds the address of num

cout << "Value of num: " << *ptr << endl; // Dereference the pointer to get the value of num
return 0;
}

Output:​

Value of num: 10

5. Null Pointers​

A pointer that is not assigned a valid memory address is called a null pointer. It is a good practice to initialize pointers to nullptr to avoid unexpected behavior.

Example:​

int* ptr = nullptr;  // Pointer is initialized to null

6. Pointers and Arrays​

Pointers can be used to iterate over arrays. The name of an array acts as a pointer to its first element.

Example:​

#include <iostream>
using namespace std;

int main() {
int arr[3] = {1, 2, 3};
int* ptr = arr; // Pointer points to the first element of the array

for (int i = 0; i < 3; i++) {
cout << *(ptr + i) << endl; // Dereferencing to get array elements
}
return 0;
}

Output:​

1
2
3

7. Pointer Arithmetic​

You can perform arithmetic operations on pointers like incrementing or decrementing them. When you increment a pointer, it moves to the next memory location based on the data type it points to.

Example:​

#include <iostream>
using namespace std;

int numbers[3] = {10, 20, 30};
int* ptr = numbers;

cout << "First element: " << *ptr << endl;
ptr++;
cout << "Second element: " << *ptr << endl;

Output:​

First element: 10
Second element: 20

8. Pointers to Pointers​

A pointer can also point to another pointer, creating a chain of pointers.

Example:​

#include <iostream>
using namespace std;

int num = 10;
int* ptr = &num;
int** ptr2 = &ptr; // Pointer to a pointer

cout << "Value of num: " << **ptr2 << endl; // Dereferencing twice to get the value

Output:​

Value of num: 10

9. Dynamic Memory Allocation​

Pointers are often used with dynamic memory allocation using the new and delete operators.

Example:​

#include <iostream>
using namespace std;

int* ptr = new int; // Allocates memory dynamically
*ptr = 100; // Assign value to the dynamically allocated memory

cout << "Value: " << *ptr << endl;

delete ptr; // Free the dynamically allocated memory

Output:​

Value: 100

10. Common Pointer Errors​

  1. Dangling Pointer: Occurs when a pointer points to memory that has already been deallocated.
  2. Memory Leak: Happens when dynamically allocated memory is not properly freed.
  3. Wild Pointer: A pointer that is not initialized to any valid memory address.

Always ensure proper memory management and pointer initialization to avoid these issues.


Final Thoughts​

Pointers are a powerful tool in C++ that allow for efficient memory management and manipulation. However, they require careful handling to avoid common pitfalls such as memory leaks and dangling pointers.

Happy coding!