×

Advanced Coding & Software Engineering Program

Duration: 1 Year (12 Months)

Join our premium 1-year program to master cutting-edge technologies and become an industry-ready Software Engineer!

Course Coverage

  • Languages: C, C++, Java, JavaScript, Python
  • Web Technologies: HTML, CSS, Bootstrap 5, MERN Stack, Full Stack Development
  • Databases: MySQL, MongoDB
  • Data Science Libraries: Pandas, NumPy
  • Development Tools: Visual Studio Code, IntelliJ IDEA, PyCharm, Postman, Git, GitHub
  • Cloud Platforms: Vercel, MongoDB Atlas

Program Highlights

  • Live Classes: Interactive sessions with real-time doubt resolution
  • Hands-On Sessions: Practical coding exercises to build real-world skills
  • Industry Experts: Learn from professionals with years of experience
  • Live Project: Work on real-world projects to apply your skills
  • Get Certificate: Earn a professional certificate upon program completion

Course Fee: Only ₹1020 / month
Limited Period Offer!

Pointers in C: From Basics to Advanced



Last Updated on: 22nd Jul 2025 19:29:14 PM

Pointers in C are like treasure maps, guiding you to specific memory locations to access or manipulate data. They are powerful but require care to use effectively. This tutorial covers Pointer Basics and Arithmetic, Pointers with Arrays and Strings, and Pointers to Pointers, progressing from beginner to advanced levels. Designed for your website, it includes unique, engaging examples with user input via scanf and fgets to captivate students. Each example includes code, output, and a detailed explanation to ensure clarity and excitement. Let’s unlock the power of pointers!

 

1. Introduction to Pointers

A pointer in C is a variable that stores the memory address of another variable. Think of it as a signpost pointing to a house (data) in memory. Pointers enable direct memory manipulation, making them essential for efficient programming.

 

Key Features:

  • Store memory addresses (e.g., 0x7fff5fbff8ac).

  • Allow direct access to variables, arrays, or functions.

  • Enable dynamic memory management and complex data structures.

 

Why Use Pointers?

  • Manipulate data directly in memory.

  • Pass large data efficiently to functions.

  • Support arrays, strings, and advanced structures like linked lists.

 

2. Pointer Basics and Arithmetic

 

2.1. Pointer Basics

  • Declaration: data_type *pointer_name;

  • Initialization: Assign the address of a variable using & (e.g., ptr = &var;).

  • Dereferencing: Access the value at the address using * (e.g., *ptr).

  • Null Pointer: ptr = NULL; to indicate no valid address.

 

Key Operators:

  • : Address-of operator (e.g., &x gives x’s address).

  • : Dereference operator (e.g., *ptr accesses the value at ptr).

 

2.2. Pointer Arithmetic

Pointers can be incremented or decremented to move through memory:

  • ptr++: Moves to the next memory location of the data type (e.g., for int*, moves 4 bytes on most systems).

  • ptr + n: Moves n elements forward.

  • ptr1 - ptr2: Calculates the number of elements between two pointers (same type).

 

Basic Example: Swap Two Numbers Using Pointers

This program takes two numbers from the user and swaps them using pointers.

#include <stdio.h>
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main() {
    int x, y;
    printf("Enter two numbers (x y): ");
    scanf("%d %d", &x, &y);
    
    printf("Before swap: x = %d, y = %d\n", x, y);
    swap(&x, &y);
    printf("After swap: x = %d, y = %d\n", x, y);
    return 0;
}

 

Output (example user input: 5 10):

Enter two numbers (x y): 5 10
Before swap: x = 5, y = 10
After swap: x = 10, y = 5

 

Explanation:

  • The user inputs two integers, x and y, using scanf.

  • The swap function takes pointers to x and y (&x, &y), dereferences them with * to swap their values.

  • Changes to *a and *b modify the original variables, demonstrating call-by-reference.

 

3. Pointer Arithmetic

 

Example: Sum of Array Elements Using Pointer Arithmetic

This program takes 5 integers from the user and calculates their sum using pointer arithmetic.

#include <stdio.h>
#define SIZE 5
int main() {
    int arr[SIZE], sum = 0;
    int *ptr = arr;
    
    printf("Enter %d integers:\n", SIZE);
    for (int i = 0; i < SIZE; i++) {
        printf("Element %d: ", i + 1);
        scanf("%d", ptr + i);
    }
    
    for (int i = 0; i < SIZE; i++) {
        sum += *(ptr + i);
    }
    
    printf("\nArray elements: ");
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", *(ptr + i));
    }
    printf("\nSum: %d\n", sum);
    return 0;
}

 

Output (example user input: 1, 2, 3, 4, 5):

Enter 5 integers:
Element 1: 1
Element 2: 2
Element 3: 3
Element 4: 4
Element 5: 5

Array elements: 1 2 3 4 5 
Sum: 15

 

Explanation:

  • The arr array stores 5 integers, input using scanf via pointer ptr + i.

  • ptr points to arr[0], and ptr + i accesses subsequent elements (e.g., ptr + 1 moves 4 bytes for int).

  • The sum is computed using * to dereference each element.

  • The array is printed using pointer arithmetic, showing equivalence to array indexing.

 

4. Pointers with Arrays and Strings

Pointers are closely tied to arrays and strings, as arrays decay to pointers to their first element, and strings are arrays of characters.

 

4.1. Pointers with Arrays

  • An array name (e.g., arr) is a pointer to its first element (&arr[0]).

  • *(arr + i) is equivalent to arr[i].

 

4.2. Pointers with Strings

  • Strings are char arrays ending with \0.

  • A char* pointer can traverse or manipulate a string.

 

Example: Reverse a String Using Pointers

This program takes a string from the user and reverses it using pointers.

#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
    int len = strlen(str);
    char *start = str, *end = str + len - 1, temp;
    
    while (start < end) {
        temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
}
int main() {
    char str[100];
    printf("Enter a string: ");
    fgets(str, 100, stdin);
    str[strcspn(str, "\n")] = '\0'; // Remove newline
    
    printf("Original: %s\n", str);
    reverseString(str);
    printf("Reversed: %s\n", str);
    return 0;
}

 

Output (example user input: Hello):

Enter a string: Hello
Original: Hello
Reversed: olleH

 

Explanation:

  • fgets reads a string with spaces, and strcspn removes the newline.

  • The reverseString function uses two pointers: start (first character) and end (last character).

  • The function swaps characters using *start and *end until the pointers meet.

  • The string is modified in-place, leveraging pointer arithmetic.

 

5. Pointers to Pointers

A pointer to a pointer is a variable that stores the address of another pointer. It’s useful for managing 2D arrays or passing pointers to functions for modification.

Declaration:

data_type **ptr; // Pointer to pointer

 

Use Case:

  • Access a pointer’s address (e.g., ptr = &pointer1).

  • Manipulate 2D arrays or dynamic memory.

Example: Matrix Input Using Pointer to Pointer

This program takes a 2x2 matrix from the user using a pointer to pointer.

#include <stdio.h>
#define ROWS 2
#define COLS 2
int main() {
    int matrix[ROWS][COLS];
    int *arr[ROWS]; // Array of pointers
    int **ptr = arr; // Pointer to pointer
    
    // Initialize array of pointers
    for (int i = 0; i < ROWS; i++) {
        arr[i] = matrix[i];
    }
    
    printf("Enter elements for a %dx%d matrix:\n", ROWS, COLS);
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("Element [%d][%d]: ", i, j);
            scanf("%d", &ptr[i][j]);
        }
    }
    
    printf("\nMatrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d", ptr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

Output (example user input: 1, 2, 3, 4):

Enter elements for a 2x2 matrix:
Element [0][0]: 1
Element [0][1]: 2
Element [1][0]: 3
Element [1][1]: 4

Matrix:
   1   2
   3   4

 

Explanation:

  • arr is an array of pointers, where arr[i] points to matrix[i] (each row).

  • ptr is a pointer to pointer, pointing to arr.

  • scanf inputs values into ptr[i][j], equivalent to matrix[i][j].

  • The matrix is printed using pointer-to-pointer access, demonstrating 2D array handling.

 

6. Advanced Example: Palindrome Checker with Pointers

This program checks if a user-entered string is a palindrome using pointers.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isPalindrome(char *str) {
    int len = strlen(str);
    char *start = str, *end = str + len - 1;
    
    while (start < end) {
        while (!isalnum(*start) && start < end) start++; // Skip non-alphanumeric
        while (!isalnum(*end) && start < end) end--;
        if (tolower(*start) != tolower(*end)) {
            return 0;
        }
        start++;
        end--;
    }
    return 1;
}
int main() {
    char str[100];
    printf("Enter a string: ");
    fgets(str, 100, stdin);
    str[strcspn(str, "\n")] = '\0';
    
    printf("String: %s\n", str);
    if (isPalindrome(str)) {
        printf("This is a palindrome.\n");
    } else {
        printf("This is not a palindrome.\n");
    }
    return 0;
}

 

Output (example user input: Racecar):

Enter a string: Racecar
String: Racecar
This is a palindrome.

 

Explanation:

  • fgets reads a string, and strcspn removes the newline.

  • The isPalindrome function uses two pointers (start, end) to compare characters from both ends.

  • Non-alphanumeric characters are skipped using isalnum, and tolower ensures case-insensitive comparison.

  • If all pairs match, the string is a palindrome.

 

7. Advanced Example: Sparse Matrix Operations with Pointers

This program takes a 3x3 sparse matrix from the user, stores non-zero elements in a compact form using pointers, and reconstructs the matrix.

#include <stdio.h>
#define ROWS 3
#define COLS 3
#define MAX_NON_ZERO 9
void storeSparse(int matrix[ROWS][COLS], int (*sparse)[3], int *count) {
    *count = 0;
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (matrix[i][j] != 0) {
                sparse[*count][0] = i;
                sparse[*count][1] = j;
                sparse[*count][2] = matrix[i][j];
                (*count)++;
            }
        }
    }
}
void reconstructMatrix(int sparse[MAX_NON_ZERO][3], int count, int matrix[ROWS][COLS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            matrix[i][j] = 0;
        }
    }
    for (int i = 0; i < count; i++) {
        matrix[sparse[i][0]][sparse[i][1]] = sparse[i][2];
    }
}
int main() {
    int matrix[ROWS][COLS], sparse[MAX_NON_ZERO][3], count;
    
    printf("Enter elements for a %dx%d matrix:\n", ROWS, COLS);
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("Element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
    
    storeSparse(matrix, sparse, &count);
    
    printf("\nSparse Representation (Row, Col, Value):\n");
    for (int i = 0; i < count; i++) {
        printf("%d %d %d\n", sparse[i][0], sparse[i][1], sparse[i][2]);
    }
    
    int reconstructed[ROWS][COLS];
    reconstructMatrix(sparse, count, reconstructed);
    
    printf("\nReconstructed Matrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d", reconstructed[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

Output (example user input: {0, 1, 0}, {2, 0, 3}, {0, 0, 4}):

Enter elements for a 3x3 matrix:
Element [0][0]: 0
Element [0][1]: 1
Element [0][2]: 0
Element [1][0]: 2
Element [1][1]: 0
Element [1][2]: 3
Element [2][0]: 0
Element [2][1]: 0
Element [2][2]: 4

Sparse Representation (Row, Col, Value):
0 1 1
1 0 2
1 2 3
2 2 4

Reconstructed Matrix:
   0   1   0
   2   0   3
   0   0   4

 

Explanation:

  • The user inputs a 3x3 matrix using scanf.

  • The storeSparse function uses a pointer to store non-zero elements as [row, col, value] in sparse.

  • The reconstructMatrix function rebuilds the matrix from the sparse representation.

  • Pointers enable efficient access to the 2D arrays, demonstrating advanced memory manipulation.

 

8. Why Pointers Are Essential

Pointers in C are critical for:

  • Direct Memory Access: Manipulate data efficiently.

  • Data Structures: Enable arrays, strings, and linked lists.

  • Function Flexibility: Support call-by-reference and dynamic behavior.


Online - Chat Now
Let’s Connect

Inquiry Sent!

Your message has been successfully sent. We'll get back to you soon!

iKeySkills Logo