×

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!

Functions and Pointers in C: From Basics to Advanced



Last Updated on: 23rd Jul 2025 17:51:34 PM

Functions and pointers in C are like the gears and levers of a machine, working together to create efficient, modular, and powerful programs. Functions allow code reuse, while pointers enable direct memory manipulation, making them a dynamic duo for tasks like data processing and algorithm implementation. This tutorial covers Functions, Passing Pointers to Functions, and Function Pointers, progressing from beginner-friendly concepts to advanced applications. Designed for your website, it features 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 dive into functions and pointers!

 

1. Introduction to Functions

A function in C is a block of code that performs a specific task, reusable across a program. Functions improve modularity, readability, and maintainability.

 

Key Features:

  • Defined with a return type, name, and parameters (e.g., int add(int a, int b)).

  • Called by name with arguments (e.g., add(2, 3)).

  • Can return a value or be void (no return).

 

Why Use Functions?

  • Break complex problems into smaller, manageable tasks.

  • Enable code reuse without duplication.

  • Simplify debugging and testing.

 

Syntax:

return_type function_name(parameter_list) {
    // Code block
    return value; // Optional
}

 

2. Passing Pointers to Functions

Passing pointers to functions allows functions to modify the original variables (call-by-reference) or handle large data efficiently (e.g., arrays, strings).

 

Key Concepts:

  • Pass the address of a variable using & (e.g., func(&var)).

  • Functions receive pointers as parameters (e.g., int *ptr).

  • Dereference pointers with * to access or modify the value.

 

Basic Example: Update User-Entered Coordinates

This program takes x and y coordinates from the user and scales them using a function with pointers.

#include <stdio.h>
void scaleCoordinates(int *x, int *y, int factor) {
    *x *= factor;
    *y *= factor;
}
int main() {
    int x, y, factor;
    printf("Enter x and y coordinates: ");
    scanf("%d %d", &x, &y);
    printf("Enter scaling factor: ");
    scanf("%d", &factor);
    
    printf("Before scaling: (%d, %d)\n", x, y);
    scaleCoordinates(&x, &y, factor);
    printf("After scaling: (%d, %d)\n", x, y);
    return 0;
}

 

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

Enter x and y coordinates: 3 4
Enter scaling factor: 2
Before scaling: (3, 4)
After scaling: (6, 8)

 

Explanation:

  • The user inputs x, y, and a factor using scanf.

  • The scaleCoordinates function takes pointers to x and y, scaling their values by factor using *.

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

 

3. Functions with Arrays and Strings via Pointers

Arrays and strings are passed to functions as pointers, allowing efficient manipulation without copying large data.

 

Example: Count Vowels in a String

This program takes a string from the user and counts its vowels using a pointer-based function.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int countVowels(char *str) {
    int count = 0;
    while (*str) {
        char ch = tolower(*str);
        if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
            count++;
        }
        str++;
    }
    return count;
}
int main() {
    char str[100];
    printf("Enter a string: ");
    fgets(str, 100, stdin);
    str[strcspn(str, "\n")] = '\0';
    
    printf("String: %s\n", str);
    printf("Number of vowels: %d\n", countVowels(str));
    return 0;
}

 

Output (example user input: Programming is fun):

Enter a string: Programming is fun
String: Programming is fun
Number of vowels: 5

 

Explanation:

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

  • The countVowels function takes a char* pointer to the string, traversing it with str++.

  • Each character is checked for vowels using *str, with tolower ensuring case-insensitivity.

  • The function returns the vowel count, demonstrating pointer-based string processing.

 

4. Function Pointers

A function pointer is a pointer that stores the address of a function, allowing functions to be called dynamically or passed as arguments.

 

Syntax:

return_type (*pointer_name)(parameter_types); // Declaration
pointer_name = function_name; // Initialization

 

Use Case:

  • Implement callbacks or dynamic function selection.

  • Enable flexible algorithm design (e.g., sorting with custom comparators).

 

Example: Calculator with Function Pointers

This program takes two numbers and an operation choice, using function pointers to perform arithmetic.

#include <stdio.h>
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int main() {
    int a, b, choice;
    printf("Enter two numbers: ");
    scanf("%d %d", &a, &b);
    printf("Choose operation (1=Add, 2=Subtract, 3=Multiply): ");
    scanf("%d", &choice);
    
    int (*operation)(int, int); // Function pointer
    char *opName;
    
    switch (choice) {
        case 1:
            operation = add;
            opName = "Addition";
            break;
        case 2:
            operation = subtract;
            opName = "Subtraction";
            break;
        case 3:
            operation = multiply;
            opName = "Multiplication";
            break;
        default:
            printf("Invalid choice!\n");
            return 1;
    }
    
    printf("%s of %d and %d = %d\n", opName, a, b, operation(a, b));
    return 0;
}

 

Output (example user input: 5 3, choice 1):

Enter two numbers: 5 3
Choose operation (1=Add, 2=Subtract, 3=Multiply): 1
Addition of 5 and 3 = 8

 

Explanation:

  • The user inputs two numbers and an operation choice using scanf.

  • A function pointer operation is declared to point to functions with two int parameters and an int return.

  • Based on choice, operation is set to add, subtract, or multiply.

  • The function is called via operation(a, b), showing dynamic function selection.

 

5. Advanced Example: Matrix Rotation Using Pointers

This program takes a 3x3 matrix from the user and rotates it 90 degrees clockwise using a pointer-based function.

#include <stdio.h>
#define N 3
void rotateMatrix(int (*matrix)[N]) {
    // Transpose (swap across diagonal)
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            int temp = *(*(matrix + i) + j);
            *(*(matrix + i) + j) = *(*(matrix + j) + i);
            *(*(matrix + j) + i) = temp;
        }
    }
    // Reverse each row
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N / 2; j++) {
            int temp = *(*(matrix + i) + j);
            *(*(matrix + i) + j) = *(*(matrix + i) + (N - 1 - j));
            *(*(matrix + i) + (N - 1 - j)) = temp;
        }
    }
}
int main() {
    int matrix[N][N];
    
    printf("Enter elements for a %dx%d matrix:\n", N, N);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("Element [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }
    
    printf("\nOriginal Matrix:\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%4d", matrix[i][j]);
        }
        printf("\n");
    }
    
    rotateMatrix(matrix);
    
    printf("\nRotated Matrix (90° clockwise):\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%4d", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

Output (example user input: {1, 2, 3}, {4, 5, 6}, {7, 8, 9}):

Enter elements for a 3x3 matrix:
Element [0][0]: 1
Element [0][1]: 2
Element [0][2]: 3
Element [1][0]: 4
Element [1][1]: 5
Element [1][2]: 6
Element [2][0]: 7
Element [2][1]: 8
Element [2][2]: 9

Original Matrix:
   1   2   3
   4   5   6
   7   8   9

Rotated Matrix (90° clockwise):
   7   4   1
   8   5   2
   9   6   3

 

Explanation:

  • The user inputs a 3x3 matrix using scanf.

  • The rotateMatrix function takes a pointer to an array (int (*matrix)[N]), performing:

    1. Transpose: Swap elements across the main diagonal using pointer arithmetic (*(*(matrix + i) + j)).

    2. Reverse each row to complete the 90-degree rotation.

  • The matrix is modified in-place, and the result is printed with %4d for alignment.

 

6. Advanced Example: Dynamic Function Dispatcher

This program allows the user to apply different string transformations (uppercase, reverse, or length) using function pointers stored in an array.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
void toUppercase(char *str) {
    while (*str) {
        *str = toupper(*str);
        str++;
    }
}
void reverseString(char *str) {
    int len = strlen(str);
    char *start = str, *end = str + len - 1;
    while (start < end) {
        char temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
}
int stringLength(char *str) {
    return strlen(str);
}
int main() {
    char str[100];
    int choice;
    
    printf("Enter a string: ");
    fgets(str, 100, stdin);
    str[strcspn(str, "\n")] = '\0';
    
    printf("Choose transformation (1=Uppercase, 2=Reverse, 3=Length): ");
    scanf("%d", &choice);
    
    void (*transform[])(char *) = {toUppercase, reverseString};
    int (*lengthFunc)(char *) = stringLength;
    
    printf("\nOriginal: %s\n", str);
    if (choice >= 1 && choice <= 2) {
        transform[choice - 1](str);
        printf("Transformed: %s\n", str);
    } else if (choice == 3) {
        printf("Length: %d\n", lengthFunc(str));
    } else {
        printf("Invalid choice!\n");
        return 1;
    }
    return 0;
}

 

Output (example user input: Hello, choice 2):

Enter a string: Hello
Choose transformation (1=Uppercase, 2=Reverse, 3=Length): 2

Original: Hello
Transformed: olleH

 

Explanation:

  • The user inputs a string and a transformation choice using fgets and scanf.

  • An array of function pointers transform stores toUppercase and reverseString.

  • A separate function pointer lengthFunc handles stringLength.

  • Based on choice, the appropriate function is called dynamically via the function pointer.

  • The string is modified in-place for transformations 1 and 2, or the length is returned for 3.

 

7. Best Practices for Functions and Pointers in C

  • Use Descriptive Function Names: Reflect the function’s purpose (e.g., scaleCoordinates).

  • Validate Pointers: Check for NULL before dereferencing.

  • Pass Arrays as Pointers: Avoid copying large data by passing pointers.

  • Use Function Pointers for Flexibility: Enable dynamic behavior in algorithms.

  • Document Parameters: Comment on pointer usage and function purpose.

  • Ensure Array Bounds: Prevent out-of-bounds access in pointer-based array operations.

  • Free Dynamic Memory: If used, free allocated memory to avoid leaks.

 

8. Why Functions and Pointers Are Essential

Functions and pointers in C are critical for:

  • Modular Code: Functions break programs into reusable units.

  • Efficient Data Handling: Pointers enable direct memory access and call-by-reference.

  • Dynamic Behavior: Function pointers support flexible, runtime function selection.

Happy coding heart


Online - Chat Now
Let’s Connect

Inquiry Sent!

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

iKeySkills Logo