LearnContact
Lesson 2110 min read

Pointers

Learn how pointers store memory addresses, how the & and * operators work, and why pointers are essential for advanced C programming.

Introduction

Imagine you have a house. Every house has a unique address. If someone wants to visit your house, they don't need to know every detail about the house—they only need its address. Similarly, every variable in a C program is stored somewhere in the computer's memory, and every memory location has a unique address. A Pointer is a special variable that stores the memory address of another variable instead of storing its actual value.

What is a Pointer?

A Pointer is a variable that stores the memory address of another variable. Unlike normal variables, which store values, pointers store addresses. For example, a normal variable might store 100, while a pointer stores the address where 100 is stored.

Why Do We Need Pointers?

Key Advantages

Real-World Impact

Without pointers, many advanced programming techniques, operating systems, and database engines would not be possible.

Real-World Analogy

Imagine a hotel. Every room has a Room Number (Address) and a Guest (Value). If someone asks "Where is Rahul staying?", you answer "Room 101". You gave the address, not the person. Similarly, a pointer stores the room number (address) instead of the guest (value).

Room 101 → Rahul
Room 102 → Amit
Room 103 → Priya
Pointer stores "101", not "Rahul"

Memory and Variables

Suppose a variable stores Age = 20. In memory, it looks like this:

Memory Representation
Address        Value
1000  ─────►   20

Here,
Address → 1000
Value   → 20

A pointer stores 1000, not 20.

Pointer Representation

Visual Layout
Variable: age
Address      Value
1000  ─────► 20

Pointer: ptr
Address      Value
2000  ─────► 1000  (stores address of age)

• age stores 20
• ptr stores the address of age (1000)

Pointer Terminology

Address

The memory location where a variable is stored.

Pointer Variable

A variable that stores an address.

Referencing

Obtaining the address of a variable.

Dereferencing

Accessing the value stored at a memory address.

Address (&) and Dereference (*) Operators

Address Operator (&)

Returns the memory address of a variable.

Dereference Operator (*)

Accesses the value stored at the address contained in a pointer.

How Pointers Work

The complete process follows this sequence:

Variable
Memory Address
Pointer Stores Address
Pointer Accesses Value

Declaring a Pointer

A pointer must specify the type of data whose address it will store.

Syntax
data_type *pointer_name;

// Example:
int *ptr;

// int → Pointer will store the address of an integer.
// ptr → Pointer name.

Example: Creating a Pointer

c
#include <stdio.h>

int main()
{
    int age = 20;

    int *ptr = &age;

    printf("%d\n", age);

    printf("%p\n", ptr);

    printf("%d", *ptr);

    return 0;
}

Line-by-Line Explanation

Line 5: int age = 20;

Creates an integer variable named age and stores the value 20. Memory: Address 1000 → Value 20.

Line 7: int *ptr = &age;

int means the pointer stores an integer's address. * indicates ptr is a pointer. &age returns the memory address of age, which is stored inside ptr.

Line 9: printf("%d\\n", age);

Displays the value stored in age. Output: 20.

Line 11: printf("%p\\n", ptr);

Displays the address stored inside the pointer. %p is the format specifier for pointers. Output: 1000 (example address).

Line 13: printf("%d", *ptr);

The * operator dereferences the pointer. It reads the address in ptr, goes to that address, and retrieves the value. Output: 20.

Line 15: return 0;

Ends the program successfully.

Memory Representation of Example

Memory Layout
age:
Address      Value
1000 ─────► 20

ptr:
Address      Value
2000 ─────► 1000  (points to age)

Program Execution Flow

Program Starts
Create Variable age
Store Value 20
Create Pointer ptr
Store Address of age
Display Value & Address
Dereference & Display → Program Ends

Expected Output

Terminal
20
1000
20

// Note: The memory address (1000) is an example.
// The actual address will differ on your system.

Advantages of Pointers

Pointers provide many benefits
  • Efficient memory access
  • Faster parameter passing
  • Dynamic memory allocation
  • Creation of linked data structures
  • Better performance
  • Direct interaction with hardware

Real-World Applications

Operating Systems

Memory management, process management.

Data Structures

Linked Lists, Trees, Graphs.

Dynamic Memory

Programs allocate memory during execution.

File Systems

Manage file buffers and memory locations.

Embedded Systems

Communicate directly with hardware memory.

Common Beginner Mistakes

Confusing Value and Address

Remember: Variable → Stores Value. Pointer → Stores Address.

Forgetting the & Operator

A pointer stores an address, not a value. Always use & when assigning a variable's address to a pointer.

Confusing * in Declaration vs Dereferencing

In a declaration (int *ptr), * indicates a pointer. In an expression (*ptr), it accesses the value at the address.

Accessing an Uninitialized Pointer

A pointer should point to a valid memory location before dereferencing. Uninitialized pointers cause undefined behavior.

Best Practices

  • Initialize pointers before using them.
  • Use meaningful pointer names such as agePtr instead of p.
  • Use the correct pointer data type.
  • Avoid dereferencing invalid or null pointers.
  • Understand the difference between an address and a value.
  • Use %p when displaying memory addresses.

Frequently Asked Questions

What is a pointer?

A pointer is a variable that stores the memory address of another variable.

Why are pointers important?

They provide direct access to memory and enable advanced techniques like dynamic allocation and linked structures.

What does the & operator do?

It returns the memory address of a variable.

What does the * operator do?

It accesses the value stored at the memory address contained in a pointer.

Can a pointer store ordinary values?

No. A pointer stores memory addresses, not regular data values.

Key Takeaways

  • A pointer stores the memory address of another variable.
  • Every variable has a unique memory address.
  • The & operator returns an address.
  • The * operator accesses the value at an address.
  • Pointers are essential for memory management, dynamic allocation, and advanced programming in C.

Summary

Pointers are one of the most powerful features of the C programming language because they provide direct access to memory. Instead of storing data, pointers store the addresses of variables, allowing programs to manipulate memory efficiently. Although pointers may seem challenging at first, understanding addresses, referencing, and dereferencing lays the foundation for advanced topics like dynamic memory allocation, linked lists, trees, file handling, and system programming.

Next Lesson →

Dynamic Memory Allocation