c

examples

examples.c🔧
/**
 * @file examples.c
 * @brief Function Parameters and Arguments Examples
 * 
 * This file demonstrates parameter passing in C.
 * 
 * Compile: gcc -Wall examples.c -o examples
 * Run: ./examples
 */

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

/* ============================================================
 * EXAMPLE 1: PASS BY VALUE - BASIC TYPES
 * ============================================================ */
void modifyValue(int n) {
    printf("  Inside function (before): n = %d\n", n);
    n = n * 2;  // Modifies local copy
    printf("  Inside function (after): n = %d\n", n);
}

void example_pass_by_value() {
    printf("\n=== Example 1: Pass by Value ===\n");
    
    int x = 10;
    printf("Before call: x = %d\n", x);
    modifyValue(x);
    printf("After call: x = %d (unchanged!)\n", x);
}

/* ============================================================
 * EXAMPLE 2: MULTIPLE PARAMETERS
 * ============================================================ */
int calculateRectangle(int length, int width) {
    return length * width;
}

float calculateBMI(float weight, float height) {
    return weight / (height * height);
}

void example_multiple_params() {
    printf("\n=== Example 2: Multiple Parameters ===\n");
    
    int area = calculateRectangle(5, 3);
    printf("Rectangle 5x3 area: %d\n", area);
    
    float bmi = calculateBMI(70.0f, 1.75f);
    printf("BMI (70kg, 1.75m): %.2f\n", bmi);
}

/* ============================================================
 * EXAMPLE 3: ARRAY PARAMETERS
 * ============================================================ */
void printArray(int arr[], int size) {
    printf("[");
    for (int i = 0; i < size; i++) {
        printf("%d", arr[i]);
        if (i < size - 1) printf(", ");
    }
    printf("]\n");
}

int sumArray(int arr[], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum;
}

void example_array_params() {
    printf("\n=== Example 3: Array Parameters ===\n");
    
    int numbers[] = {10, 20, 30, 40, 50};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    printf("Array: ");
    printArray(numbers, size);
    printf("Sum: %d\n", sumArray(numbers, size));
}

/* ============================================================
 * EXAMPLE 4: MODIFYING ARRAY ELEMENTS
 * ============================================================ */
void doubleElements(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        arr[i] *= 2;  // Modifies original!
    }
}

void example_modify_array() {
    printf("\n=== Example 4: Modifying Arrays ===\n");
    
    int numbers[] = {1, 2, 3, 4, 5};
    int size = 5;
    
    printf("Before: ");
    printArray(numbers, size);
    
    doubleElements(numbers, size);
    
    printf("After doubling: ");
    printArray(numbers, size);
}

/* ============================================================
 * EXAMPLE 5: SIMULATING PASS BY REFERENCE
 * ============================================================ */
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void increment(int *n) {
    (*n)++;
}

void example_pass_by_reference() {
    printf("\n=== Example 5: Pass by Reference (using pointers) ===\n");
    
    // Swap example
    int x = 10, y = 20;
    printf("Before swap: x=%d, y=%d\n", x, y);
    swap(&x, &y);
    printf("After swap: x=%d, y=%d\n", x, y);
    
    // Increment example
    int count = 5;
    printf("\nBefore increment: count=%d\n", count);
    increment(&count);
    printf("After increment: count=%d\n", count);
}

/* ============================================================
 * EXAMPLE 6: CONST PARAMETERS
 * ============================================================ */
int calculateSum(const int arr[], int size) {
    // arr[0] = 0;  // Would cause error - arr is const
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum;
}

int stringLength(const char *str) {
    int len = 0;
    while (str[len] != '\0') {
        len++;
    }
    return len;
}

void example_const_params() {
    printf("\n=== Example 6: const Parameters ===\n");
    
    int numbers[] = {1, 2, 3, 4, 5};
    printf("Sum (const protected): %d\n", calculateSum(numbers, 5));
    
    const char *message = "Hello, World!";
    printf("String length: %d\n", stringLength(message));
}

/* ============================================================
 * EXAMPLE 7: STRING PARAMETERS
 * ============================================================ */
void printGreeting(char name[]) {
    printf("Hello, %s!\n", name);
}

void makeUppercase(char str[]) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] >= 'a' && str[i] <= 'z') {
            str[i] = str[i] - 32;
        }
    }
}

void example_string_params() {
    printf("\n=== Example 7: String Parameters ===\n");
    
    printGreeting("Alice");
    printGreeting("Bob");
    
    char text[] = "Hello World";
    printf("Original: %s\n", text);
    makeUppercase(text);
    printf("Uppercase: %s\n", text);
}

/* ============================================================
 * EXAMPLE 8: 2D ARRAY PARAMETERS
 * ============================================================ */
void printMatrix(int matrix[][3], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int matrixSum(int matrix[][3], int rows, int cols) {
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

void example_2d_array() {
    printf("\n=== Example 8: 2D Array Parameters ===\n");
    
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    
    printf("Matrix:\n");
    printMatrix(matrix, 2);
    printf("Sum: %d\n", matrixSum(matrix, 2, 3));
}

/* ============================================================
 * EXAMPLE 9: RETURNING MULTIPLE VALUES VIA POINTERS
 * ============================================================ */
void getMinMax(int arr[], int size, int *min, int *max) {
    *min = arr[0];
    *max = arr[0];
    
    for (int i = 1; i < size; i++) {
        if (arr[i] < *min) *min = arr[i];
        if (arr[i] > *max) *max = arr[i];
    }
}

void divMod(int dividend, int divisor, int *quotient, int *remainder) {
    *quotient = dividend / divisor;
    *remainder = dividend % divisor;
}

void example_multiple_returns() {
    printf("\n=== Example 9: Multiple Return Values ===\n");
    
    int arr[] = {23, 5, 78, 12, 45, 89, 3};
    int size = 7;
    int min, max;
    
    getMinMax(arr, size, &min, &max);
    printf("Min: %d, Max: %d\n", min, max);
    
    int q, r;
    divMod(17, 5, &q, &r);
    printf("17 / 5 = %d remainder %d\n", q, r);
}

/* ============================================================
 * EXAMPLE 10: VARIADIC FUNCTIONS
 * ============================================================ */
int sumAll(int count, ...) {
    va_list args;
    va_start(args, count);
    
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += va_arg(args, int);
    }
    
    va_end(args);
    return sum;
}

double average(int count, ...) {
    va_list args;
    va_start(args, count);
    
    double sum = 0;
    for (int i = 0; i < count; i++) {
        sum += va_arg(args, double);
    }
    
    va_end(args);
    return sum / count;
}

void example_variadic() {
    printf("\n=== Example 10: Variadic Functions ===\n");
    
    printf("sum(3, 10, 20, 30) = %d\n", sumAll(3, 10, 20, 30));
    printf("sum(5, 1, 2, 3, 4, 5) = %d\n", sumAll(5, 1, 2, 3, 4, 5));
    
    printf("avg(3, 10.0, 20.0, 30.0) = %.2f\n", 
           average(3, 10.0, 20.0, 30.0));
}

/* ============================================================
 * EXAMPLE 11: FUNCTION WITH STRUCT PARAMETER
 * ============================================================ */
struct Point {
    int x;
    int y;
};

// Pass by value - struct is copied
void printPointByValue(struct Point p) {
    printf("Point: (%d, %d)\n", p.x, p.y);
}

// Pass by pointer - more efficient
void printPointByPointer(const struct Point *p) {
    printf("Point: (%d, %d)\n", p->x, p->y);
}

// Modify struct via pointer
void movePoint(struct Point *p, int dx, int dy) {
    p->x += dx;
    p->y += dy;
}

void example_struct_params() {
    printf("\n=== Example 11: Struct Parameters ===\n");
    
    struct Point p = {10, 20};
    
    printf("By value: ");
    printPointByValue(p);
    
    printf("By pointer: ");
    printPointByPointer(&p);
    
    movePoint(&p, 5, 3);
    printf("After move(5,3): ");
    printPointByPointer(&p);
}

/* ============================================================
 * EXAMPLE 12: FUNCTION POINTER AS PARAMETER
 * ============================================================ */
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 operate(int a, int b, int (*operation)(int, int)) {
    return operation(a, b);
}

void example_function_pointer() {
    printf("\n=== Example 12: Function Pointer Parameter ===\n");
    
    int a = 20, b = 5;
    
    printf("%d + %d = %d\n", a, b, operate(a, b, add));
    printf("%d - %d = %d\n", a, b, operate(a, b, subtract));
    printf("%d * %d = %d\n", a, b, operate(a, b, multiply));
}

/* ============================================================
 * EXAMPLE 13: ARRAY OF DIFFERENT SIZES
 * ============================================================ */
void processData(int *data, int size, const char *name) {
    printf("Processing %s (%d elements): ", name, size);
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += data[i];
    }
    printf("sum = %d\n", sum);
}

void example_flexible_array() {
    printf("\n=== Example 13: Arrays of Different Sizes ===\n");
    
    int small[] = {1, 2, 3};
    int medium[] = {10, 20, 30, 40, 50};
    int large[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    processData(small, 3, "small");
    processData(medium, 5, "medium");
    processData(large, 10, "large");
}

/* ============================================================
 * EXAMPLE 14: CALLBACK PATTERN
 * ============================================================ */
void forEachElement(int arr[], int size, void (*callback)(int)) {
    for (int i = 0; i < size; i++) {
        callback(arr[i]);
    }
}

void printElement(int n) {
    printf("%d ", n);
}

void printSquare(int n) {
    printf("%d ", n * n);
}

void example_callback() {
    printf("\n=== Example 14: Callback Pattern ===\n");
    
    int numbers[] = {1, 2, 3, 4, 5};
    
    printf("Elements: ");
    forEachElement(numbers, 5, printElement);
    printf("\n");
    
    printf("Squares: ");
    forEachElement(numbers, 5, printSquare);
    printf("\n");
}

/* ============================================================
 * MAIN FUNCTION
 * ============================================================ */
int main() {
    printf("╔════════════════════════════════════════════════╗\n");
    printf("║    PARAMETERS & ARGUMENTS - EXAMPLES           ║\n");
    printf("║    Function parameter passing                  ║\n");
    printf("╚════════════════════════════════════════════════╝\n");
    
    example_pass_by_value();
    example_multiple_params();
    example_array_params();
    example_modify_array();
    example_pass_by_reference();
    example_const_params();
    example_string_params();
    example_2d_array();
    example_multiple_returns();
    example_variadic();
    example_struct_params();
    example_function_pointer();
    example_flexible_array();
    example_callback();
    
    printf("\n=== All Examples Completed! ===\n");
    
    return 0;
}
Examples - C Programming Tutorial | DeepML