Pointers In C Language

Understanding Pointers in C Programming


Introduction

In C programming, pointers are a powerful concept that allows us to manipulate memory addresses directly. Before we dive into the details, let's start with a concise definition:

A pointer is a variable that holds the memory address of another variable. Unlike normal variables that store values, pointers store addresses, providing a way to access and modify data indirectly.

Basics of Pointers

To grasp the concept of pointers, let's compare them to normal variables. A normal variable is a location in memory that can hold a value. For instance, when we declare an integer variable i, 2 bytes of memory are allocated for it. The variable i refers to a specific location in memory, known as its address.

On the other hand, a pointer holds the address of another variable instead of a direct value. It consists of two parts: the pointer itself, storing the address, and the value pointed to, residing at that address. This distinction might be confusing initially, but it becomes a powerful tool once you get comfortable with it.

Example:
int i = 5, *ptr;
ptr = &i; // A pointer is a variable that points to another variable's address

Pointer Arithmetic

Pointer variables can be involved in expressions, enabling basic arithmetic operations. However, keep in mind that adding, dividing, or multiplying pointers directly is invalid. Here's an example demonstrating pointer arithmetic:
#include <stdio.h>

    int main() {
        int x, p = 10, q = 5, z, *ptr1, *ptr2;
        ptr1 = &p;
        ptr2 = &q;

        x = *ptr1 / *ptr2;
        *ptr1 = *ptr2 - 10;
        z = *ptr1 * 10;

        printf("%d %d %d", x, *ptr1, z);
        return 0;
    }

Increment and Decrement of Pointer

#include <stdio.h>

    int main() {
        int a, *ptr1;
        float b, *ptr2;
        ptr1 = &a;

        printf("\n ptr1 is = %u", ptr1);
        ptr1++;
        printf("\n new ptr1 is = %u", ptr1);

        ptr2 = &b;
        printf("\n ptr2 is = %u", ptr2);
        ptr2--;
        printf("\n new ptr2 is = %u", ptr2);

        return 0;
    }
#include <stdio.h>

    int main() {
        int arr[5] = {10, 20, 30, 40, 50};
        int i, *ptr;
        ptr = &arr[0];

        for (i = 0; i < 5; i++) {
            printf("\n Element: %d\t Address: %u", *ptr, ptr);
            ptr++;
        }

        return 0;
    }

Pointer and Arrays

When it comes to arrays, pointers can be powerful tools for efficient memory access. An array's name itself is a constant pointer to its first element. Consider the following example:
#include <stdio.h>

    int main() {
        int i, j, *ptr, arr[2][2] = {{1, 2}, {3, 4}};
        ptr = &arr[0][0];

        printf("Print the 2D array elements\n");

        for (i = 0; i < 2; i++) {
            for (j = 0; j < 2; j++) {
                printf("%d\t", *ptr++);
            }
            printf("\n");
        }

        return 0;
    }

Pointer to String

Strings in C are represented as arrays of characters. Pointers can be used to navigate through string elements efficiently. Here's an example:
#include <stdio.h>

    int main() {
        char name[10] = "Example";
        char *ptr = &name[0];

        while (*ptr != '\0') {
            printf("\n Character: %c\t Address: %u", *ptr, ptr);
            ptr++;
        }

        return 0;
    }

Pointer to Pointer

Pointers themselves can be the targets of other pointers, forming a chain. Here's an example:
#include <stdio.h>

    int main() {
        char name = 'a', *ptr_ch = &name;
        char **ptr = &ptr_ch;

        printf("\n char is: %c", name);
        printf("\n Address of name is: %u", ptr_ch);
        printf("\n Value of name is: %u", ptr_ch);
        printf("\n Address of name is: %u", ptr);
        printf("\n Value of ptr is: %u", ptr);
        printf("\n Character is %c", *ptr_ch);
        printf("\n Character is %c", **ptr);

        return 0;
    }

Conclusion

Understanding pointers is essential for mastering C programming. They provide a direct and efficient way to manipulate memory, making them a crucial aspect of low-level programming. Practice and familiarity with pointer concepts will unlock their full potential in your coding journey.