Back to C Programming
2026-07-145 min read

Pointer (C Programming)

Learn Pointer (C Programming) step by step with clear examples and exercises.

Why This Matters

Pointers are a fundamental concept in C programming that allow you to manipulate memory directly, providing greater control over your programs. They're essential for various tasks such as dynamic memory allocation, function parameters, and linked data structures. Understanding pointers is crucial for acing coding interviews, debugging real-world issues, and creating efficient C programs.

Prerequisites

Before diving into pointers, you should have a good understanding of the following topics:

  1. Variables and Data Types in C
  2. Basic Operators (Arithmetic, Relational, Assignment)
  3. Control Statements (if, if-else, switch)
  4. Functions in C
  5. Arrays in C
  6. Understanding the concept of memory allocation and deallocation in C.
  7. Familiarity with basic concepts of data structures like arrays and linked lists.

Core Concept

What is a Pointer?

A pointer is a variable that stores the memory address of another variable. In simple terms, it's like a label or an address tag that points to a specific location in your computer's memory where data resides. Pointers are denoted by the asterisk symbol (*) in C.

Declaring and Initializing Pointers

To declare a pointer variable, you use the asterisk symbol followed by the data type of the variable it will point to:

int *ptr; // declares ptr as a pointer to an integer

To initialize a pointer, you assign it the memory address of another variable:

int num = 10;
int *ptr = # // initializes ptr with the memory address of num

Accessing and Modifying Data through Pointers

You can access and modify data stored in a variable using its corresponding pointer:

int num = 10;
int *ptr = #

*ptr = 20; // modifies the value of num through ptr
printf("%d", num); // prints 20

Pointer Arithmetic

Pointer arithmetic allows you to move from one memory location to another by adding or subtracting integers. For example, if ptr points to an integer and we increment it by 1, it will point to the next integer in memory:

int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;

printf("%d", *ptr); // prints 1 (the value at the first memory location)
ptr++; // increments ptr to point to the next integer
printf("%d", *ptr); // prints 2 (the value at the second memory location)

Dynamic Memory Allocation with Pointers

One of the main uses of pointers is dynamic memory allocation. This allows you to allocate and deallocate memory during runtime, making your programs more flexible:

int *ptr = (int *) malloc(5 * sizeof(int)); // allocates memory for an array of 5 integers
for (int i = 0; i < 5; i++) {
ptr[i] = i * 2; // assigns values to the allocated memory
}
free(ptr); // deallocates the memory when it's no longer needed

Worked Example

Let's create a simple program that declares an array of 5 integers, initializes a pointer to its first element, and iterates through the array using the pointer:

#include <stdio.h>
#include <stdlib.h>

int main() {
int arrSize = 5;
int *arr = (int *) malloc(arrSize * sizeof(int));

for (int i = 0; i < arrSize; i++) {
arr[i] = i * 2;
}

int *ptr = arr;

for (int i = 0; i < arrSize; i++) {
printf("%d ", *ptr);
ptr++;
}

free(arr); // deallocates the memory when it's no longer needed

return 0;
}

Output: 0 2 4 6 8

Common Mistakes

  1. Forgetting the asterisk when dereferencing a pointer: Instead of *ptr, using just ptr will result in an error.
int num = 10;
int *ptr = &num;

ptr = 20; // incorrect, should be *ptr = 20
printf("%d", num); // prints 10 (not 20)
  1. Incorrect pointer arithmetic: When performing pointer arithmetic, remember that each element in an array occupies one memory location. So if you have an integer array, incrementing a pointer by 1 will point to the next integer.
int arr[] = {1, 2, 3};
int *ptr = arr;

printf("%d", *(ptr + 1)); // prints 2 (not 3) because we need to increment twice to reach the second element
  1. Memory leaks: Forgetting to deallocate memory allocated with malloc() can lead to memory leaks, which can cause your program to consume excessive resources and potentially crash. Always make sure to free memory when it's no longer needed.
  1. Dereferencing uninitialized or invalid pointers: Dereferencing an uninitialized or invalid pointer can lead to undefined behavior, which may result in a segmentation fault or unexpected program output. Always make sure your pointers are properly initialized and point to valid memory locations.

Common Mistakes - Subheadings

  • Forgetting the asterisk when dereferencing a pointer
  • Incorrect pointer arithmetic
  • Memory leaks
  • Dereferencing uninitialized or invalid pointers

Practice Questions

  1. Write a program that declares an array of 5 integers, initializes a pointer to its first element, and calculates their sum using a loop and pointers.
  2. Create a function called swap() that takes two integer pointers as arguments and swaps their values. Test the function by creating two integer variables and calling the function.
  3. Write a program that finds the maximum number in an array of 10 integers using pointers and without using built-in functions like max().
  4. Implement dynamic memory allocation for a 2D array (matrix) of integers with rows and columns specified at runtime.
  5. Write a function called reverseArray() that takes an integer pointer to the first element of an array and reverses its elements using pointers.
  6. Create a linked list data structure using pointers, where each node contains an integer value and a pointer to the next node. Implement functions for inserting nodes at the beginning and end of the list.

FAQ

Q: Why do we use pointers in C?

A: Pointers provide greater control over memory, allowing for dynamic memory allocation, efficient function parameters, and the creation of complex data structures like linked lists and trees.

Q: How can I check if a pointer is NULL or not?

A: You can use the == operator to compare a pointer with NULL. For example:

int *ptr = NULL;
if (ptr == NULL) {
printf("ptr is NULL\n");
}

Q: What happens if I try to dereference an uninitialized or invalid pointer?

A: Dereferencing an uninitialized or invalid pointer can lead to undefined behavior, which may result in a segmentation fault or unexpected program output. Always make sure your pointers are properly initialized and point to valid memory locations.

Q: How does dynamic memory allocation work with pointers?

A: Dynamic memory allocation with pointers involves using functions like malloc(), calloc(), and realloc() to request memory during runtime. The pointer stores the address of the allocated memory, which can be accessed and manipulated as needed. When the memory is no longer required, it should be deallocated using free() to prevent memory leaks.